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代码使其加快作用域内的查找
Mar 30 Python
python根据京东商品url获取产品价格
Aug 09 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
Django项目之Elasticsearch搜索引擎的实例
Aug 21 Python
手写一个python迭代器过程详解
Aug 27 Python
Python range与enumerate函数区别解析
Feb 28 Python
python和php学习哪个更有发展
Jun 17 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
python安装sklearn模块的方法详解
Nov 28 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
Jan 19 Python
Python OpenCV超详细讲解读取图像视频和网络摄像头
Apr 02 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
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
ASP Json Parser修正版
2009/12/06 Javascript
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
Tensorflow实现多GPU并行方式
2020/02/03 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
播音主持女孩的自我评价分享
2013/11/20 职场文书
成语的广告词
2014/03/19 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
幼儿发展评估方案
2014/06/11 职场文书
电子商务求职信
2014/06/15 职场文书
上课迟到检讨书
2015/05/06 职场文书
初三语文教学反思
2016/03/03 职场文书
Redis 哨兵集群的实现
2021/06/18 Redis
Opencv中cv2.floodFill算法的使用
2021/06/18 Python