python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例


Posted in Python onMarch 05, 2020

PyQt5 MDI(多文档窗口)QMidArea简介

一种同时显示多个窗口的方法是,创建多个独立的窗口,这些独立的窗口被称为SDI(Single Document Interface 单文档界面),每个窗口都有自己的菜单系统,工具栏等,这需要占用很多资源

MDI(Multiple Document Interface 多文档界面)应用程序占用较少的内存资源,子窗口可以放在主窗口的容器中,这个容器控件被称为QMidArea

QMidArea控件通常占据在QMainWindow对象的中央位置,子窗口在这个区域是QMdiSubWindow类的实例,可以设置任何QWidget作为子窗口对象的内部控件,子窗口在MDI区域进行级联排列布局

QMidArea类和QMdiSubWindow类中的常用方法

方法 描述
addSubWindow() 将一个小控件添加在MDI区域作为一个新的子窗口
removeSubWindow() 删除一个子窗口的小控件
setActiveSubWindow() 激活一个子窗口
cascadeSubWindows() 安排子窗口在MDI区域级联显示
tileSubWindows() 安装子窗口在MDI区域平铺显示
closeActiveSubWindow() 关闭活动的子窗口
subWindowList() 返回MDI区域的子窗口列表
setWidget() 设置一个小控件作为QMdiSubWindow实例对象的内部控件

QMdiArea多重文档界面代码实例

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class MainWindow(QMainWindow):
  count=0
  def __init__(self,parent=None):
    super(MainWindow, self).__init__(parent)
    #实例化Qmidarea区域
    self.mdi=QMdiArea()
    #设置为中间控件
    self.setCentralWidget(self.mdi)
    #实例化菜单栏
    bar=self.menuBar()
    #添加主菜单
    file=bar.addMenu('File')
    #添加子菜单
    file.addAction('New')
    file.addAction('cascade')
    file.addAction('Tiled')
    #点击QAction绑定自定义的槽函数(传递有值【QAction】)
    file.triggered[QAction].connect(self.windowaction)
    #设置主窗口的标题
    self.setWindowTitle("MDI demo")
  def windowaction(self,q):
    print('Triggered')
    if q.text()=='New':
      #子窗口增加一个
      MainWindow.count=MainWindow.count+1
      #实例化多文档界面对象
      sub=QMdiSubWindow()
      #向sub内添加内部控件
      sub.setWidget(QTextEdit())
      #设置新建子窗口的标题
      sub.setWindowTitle('subWindow'+str(MainWindow.count))
      #将子窗口添加到Mdi区域
      self.mdi.addSubWindow(sub)
      #子窗口显示
      sub.show()
    if q.text()=='cascade':
      #cascadeSubWindows():安排子窗口在Mdi区域级联显示
      self.mdi.cascadeSubWindows()
    if q.text()=='Tiled':
      #tileSubWindow():安排子窗口在Mdi区域平铺显示
      self.mdi.tileSubWindow()
if __name__ == '__main__':
  app=QApplication(sys.argv)
  demo=MainWindow()
  demo.show()
  sys.exit(app.exec_())

级联显示

python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例

平铺显示

python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例

代码分析

在这个例子中,主窗口QMainWindow拥有一个菜单控件和 MidArea控件

#实例化菜单栏
    bar=self.menuBar()
    #添加主菜单
    file=bar.addMenu('File')
    #添加子菜单
    file.addAction('New')
    file.addAction('cascade')
    file.addAction('Tiled')

当单击菜单控件时触发triggered信号,连接到槽函数windowaction()

file.triggered[QAction].connect(self.windowaction)

当选择菜单NEw动作时,会添加一个新的Mdi,每个Mdi都有标题,在主窗口内部增加Mdi的数量

#子窗口增加一个
      MainWindow.count=MainWindow.count+1
      #实例化多文档界面对象
      sub=QMdiSubWindow()
      #向sub内添加内部控件
      sub.setWidget(QTextEdit())
      #设置新建子窗口的标题
      sub.setWindowTitle('subWindow'+str(MainWindow.count))
      #将子窗口添加到Mdi区域
      self.mdi.addSubWindow(sub)
      #子窗口显示
      sub.show()

当选择菜单中的Cascade和tiled动作时,会在主窗口显示自窗口的排序方式,级联显示或者平铺显示

if q.text()=='cascade':
      #cascadeSubWindows():安排子窗口在Mdi区域级联显示
      self.mdi.cascadeSubWindows()
    if q.text()=='Tiled':
      #tileSubWindow():安排子窗口在Mdi区域平铺显示
      self.mdi.tileSubWindow()

本文主要讲解了PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例,更多关于PyQt5控件的使用知识请查看下面的相关链接

Python 相关文章推荐
Python转换HTML到Text纯文本的方法
Jan 15 Python
Python标准库urllib2的一些使用细节总结
Mar 16 Python
python调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
TensorFlow用expand_dim()来增加维度的方法
Jul 26 Python
pandas 根据列的值选取所有行的示例
Nov 07 Python
python导入模块交叉引用的方法
Jan 19 Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 Python
PyQt5显示GIF图片的方法
Jun 17 Python
Pytorch实现GoogLeNet的方法
Aug 18 Python
通过python连接Linux命令行代码实例
Feb 18 Python
自学python用什么系统好
Jun 23 Python
Python识别处理照片中的条形码
Nov 16 Python
Python matplotlib修改默认字体的操作
Mar 05 #Python
Django 返回json数据的实现示例
Mar 05 #Python
python利用opencv实现SIFT特征提取与匹配
Mar 05 #Python
python画图常规设置方式
Mar 05 #Python
解决python -m pip install --upgrade pip 升级不成功问题
Mar 05 #Python
python入门之井字棋小游戏
Mar 05 #Python
解决Python图形界面中设置尺寸的问题
Mar 05 #Python
You might like
php下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
ThinkPHP之R方法实例详解
2014/06/20 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
Javascript中的数学函数
2007/04/04 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
js运动应用实例解析
2015/12/28 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
详解vuex的简单使用
2018/03/12 Javascript
angularjs1.X 重构controller 的方法小结
2019/08/15 Javascript
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
Python线性回归实战分析
2018/02/01 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
selenium自动化测试入门实战
2020/12/21 Python
2013年员工自我评价范文
2013/12/27 职场文书
经典演讲稿范文
2013/12/30 职场文书
国税会议欢迎词
2014/01/16 职场文书
毕业生个人求职自荐信
2014/02/26 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
暑期实践个人总结
2015/03/06 职场文书
活动经费申请报告
2015/05/15 职场文书
妈妈别哭观后感
2015/06/08 职场文书
go语言中json数据的读取和写出操作
2021/04/28 Golang
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python