第15.37节 PyQt(Python+Qt)入门学习:containers容器类部件QMdiArea多文档界面部件详解及编程开发案例

Qt之容器控件(QMdiArea) 简述 QMdiArea(Multiple Document Interface Area)提供了一个可以同时显示多个文档窗口的区域。 本质上来说,QMdiArea就像是多文档窗口的窗口管理器。例如,它将它所管理的窗口绘制在它上面,并且以级联或者平铺的方式放置这些窗口。通常情况下,QMdiArea用作QMainWindow的中心控件,以此来创建一个MDI应用程序。但是,它也可以被放置在任何布局类中。... 阅读详情

一、引言

老猿在前期学习PyQt相关知识时,对每个组件的属性及方法都研究得很透彻,并将学习的感悟都写成了博文,这种方式写了大量博文,但也耽误了太多时间,学习PyQt的时间已经超过了学习Python基础知识和爬虫的时间,而后面还有好多部件,必须得提速了,因此老猿决定以后每种部件都只简单介绍重要的特性和方法,不每个属性和方法都研究了,就从本文开始。

二、概述

QMdiArea部件提供一个包含MDI多文档窗口的区域,在这个区域内管理多个窗口,每个窗口都可以称为激活窗口,可以做自己的事情,如移动、最小化、关闭、打开自己的文档等,而QMdiArea支持对区域内的窗口进行层叠窗口或平铺窗口,并在子窗口切换激活窗口时发射信号。

三、常用属性、方法和信号

3.1、QMdiArea中的子窗口

3.1.1、增加子窗口

QMdiArea中的子窗口类型是QMdiSubWindow的实例,但可以使用addSubWindow()方法将任何QWidget或其派生类的实例添加到MDI区域作为子窗口,此时QMdiArea会自动创建子窗口的QMdiSubWindow实例,并作为addSubWindow()方法的结果返回。

3.1.2、子窗口数量

QMdiArea中的子窗口数量无法直接通过QMdiArea方法获取,必须先通过方法subWindowList()返回所有子窗口的列表,再通过Python的len函数获取子窗口的数量。

3.1.3、子窗口排序和排列

subWindowList()返回的子窗口列表是排序的,有三种排序方式,通过属性activationOrder来控制,排序方式由枚举类型QMdiArea.WindowOrder指定,可通过Designer中就可以设置的属性activationOrder来指定。当使用cascadeSubWindows()和tileSubWindows()层叠或平铺方式来排列区域内的窗口时,也会使用该排序。

3.1.4、活动子窗口

子窗口在获得键盘焦点或调用setFocus()时变为活动状态,用户通过以通常的方式移动焦点来激活窗口。当活动窗口更改时,MDI区域会发出subWindowActivated()信号,active subwindow()函数会返回活动子窗口,槽方法setActiveSubWindow(QMdiSubWindow window)在切换活动窗口时调用。

3.1.5、移除和关闭子窗口

可以通过removeSubWindow(QWidget widget)移除指定子窗口实例,也也可以通过调用槽方法closeAllSubWindows()、closeActiveSubWindow()来关闭子窗口,可以重写这两个方法对子窗口关闭进行相关处理。

3.2、viewMode属性

viewMode属性用于控制子窗口是使用子窗口模式(QMdiArea.SubWindowView)还是选项卡模式(QMdiArea.TabbedView)显示。

如果是子窗口模式,则每个子窗口都是一个带标题栏、窗口G根据addSubWindow指定flag可以设置最大化、最小化和关闭按钮的窗口,可以执行窗口关闭和大小的变化。

如果是选项卡模式,则子窗口最大化后不显示标题栏及操作按钮,但非最大化下会同样显示,另外所有窗口都会在选项卡栏上有个选项。如图:
在这里插入图片描述

在选项卡模式下,窗口可以设置documentMode(是否支持文档模式,支持文档模式时窗口无框架,用更多的空间显示文档)、tabsClosable(在选项卡中是否显示关闭标志)、tabsMovable(各子窗口的选项卡在选项卡栏是否可以移动)、tabPosition(选项卡栏所在位置)、tabShape(选项卡形状)这几个属性,而在子窗口模式这几个属性无效。

另外,经老猿验证,在子窗口模式下添加的子窗口必须显示执行show()等方法才能显示子窗口,在选项卡模式无需执行show()等方法就可以显示子窗口。调用show方法时,既可以使用addSubWindow(widget)参数中的widget,也可以用方法返回值对应窗口。

3.3、subWindowActivated信号

subWindowActivated在一个窗口激活(获得焦点)时发射,语法如下:

  • subWindowActivated(QMdiSubWindow window)

如果window参数为None,则表示没有激活的子窗口,如果应用没有disable子窗口,则表示所有子窗口都关闭了。

这个信号比较有用,当开发的应用需要结合子窗口的个数来显示不同的状态时,可以通过这个信号判断window参数是否为None来设置不同的状态。

如下代码是将该信号连接一个槽方法,在槽方法中根据window参数设置actionclose对应按钮和菜单的状态:

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.mdiArea.subWindowActivated.connect(self.setButtonsStatus)

    def setButtonsStatus(self,win):
        if win:self.actionclose.setEnabled(True)
        else:self.actionclose.setEnabled(False)

四、案例

4.1、案例说明

老猿做了个QMidiArea的测试程序,在这个应用内,可以打开一次打开一个图像文件显示,如果打开的文件没有关闭,再打开就可以显示多个图像文件。

4.2、UI设计

界面为一个QMainWindow,带菜单、工具栏:
在这里插入图片描述
从界面看到,包括了打开文件、关闭窗口、排列窗口等功能,下面窗口上部署了QMidiArea实例,没有在Designer中定义子窗口。另外定义了菜单对应action的triggered信号和槽方法的连接,注意级联窗口和平铺窗口直接连接的是QMidiArea的槽方法cascadeSubWindows和tileSubWindows()。

4.3、子窗口的设计

为了简单,子窗口复用了《第15.35节 PyQt编程实战:结合QDial实现的QStackedWidget堆叠窗口程序例子》中的ui_GraphicFileView.ui,相关界面及类graphicFileView在此不重复介绍。

4.4、主界面派生类

主界面派生类主要完成了如下工作:

  • 在构造方法连接了QMdiArea的subWindowActivated和槽方法
  • 实现槽方法setButtonsStatus,根据是否有子窗口设置两个关闭窗口的菜单和按钮的状态
  • 实现了打开图像文件的槽方法openGraphicFile,支持选择一个图片文件打开显示
  • 实现了关闭当前窗口的槽方法closeCurrentWindow
基础代码如下:
class mainWin(QtWidgets.QMainWindow,ui_mainWin.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
   
        self.mdiArea.subWindowActivated.connect(self.setButtonsStatus)

    def setButtonsStatus(self,win):
        if win:
            self.actionclose.setEnabled(True)
            self.actioncloseAllWindow.setEnabled(True)
        else:
            self.actionclose.setEnabled(False)
            self.actioncloseAllWindow.setEnabled(False)

    def closeCurrentWindow(self):
        w = self.mdiArea.activeSubWindow()
        if w: w.close()


    def openGraphicFile(self):
        fileName = .....
        ......
        w = graphicFileView.graphicFileView(fileName)
      
        win = self.mdiArea.addSubWindow(w)
        win.show()

4.5、运行截图

在这里插入图片描述

五、小结

本部分重点介绍了QMdiArea的用途、重要特性和方法、信号,我们在开发时,先做好UI设计,然后通过代码实现QMdiArea子窗口的管理,通过信号subWindowActivated判断QMdiArea实例内是否有可用子窗口来设置相关操作菜单的状态。具体使用可以参考案例。

广告

老猿关于PyQt的付费专栏《使用PyQt开发图形界面Python应用》只需要9.9元,该部分与第十五章的内容基本对应,但同样内容在付费专栏上总体来说更详细、案例更多。本节内容对应付费专栏的《第三十章、containers容器类部件QMdiArea多文档界面部件功能介绍及编程应用》。如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

老猿Python,跟老猿学Python!

QT QMdiArea控件 使用详解 其它文章等等操作。实际开发中,一个界面上可能包含十几个控件,手动调整它们的位置既费时又费力。QMdiArea(Multiple Document Interface Area)提供了一个可以同时显示多个文档窗口的区域。本文作者原创,转载请附上文章出处与本文链接。 阅读详情

相关推荐

python pyqt5 QMdiArea添加多个子窗口布局

【Pyqt5应用实例】Pyqt5实现添加多个子窗口布局。​​功能结果显示​​。​​完整代码示例​​。

cy19890616的博客 1201

python 容器类型_从0到1玩深度学习(0.04):Python语言中容纳数据的容器类型(Containers)...

年末正在来临,还有10来天就要到除夕了。大家是不是正在积极地备年货,给家人买礼物呢?无论什么东西,都离不开“容器”。比如给别人送化妆品,你应该不会捧着各种水、乳、霜给家人,都会有包装瓶之类的,而且如果包装瓶上印有出名的牌子,这些液体的价格就会完全不同。跑偏了,总之容器是我们的生活必须品。从十万年前用于储存食物的叶子和各种土器,到现在的快递包装盒,都属于容器的范畴。容器的种类有很多,但多半是同样的功...

weixin_39595085的博客 257

详细学习Pyqt5的10种容器(Containers)

您可以根据需要添加更多的标签页,并在每个标签页内放置不同类型的子控件,以满足您的应用需求。您可以根据需要添加更多的页面,并在每个页面中放置不同类型的子控件,以实现复杂的界面布局。QGroupBox是PyQt5中的一个容器控件,它用于将一组相关的界面元素进行分组,从而在界面中创建有组织的部分。在这个示例中,我们首先创建了一个QFrame,然后在该QFrame中创建了两个QLabel。在这个示例中,我们首先创建了一个QWidget作为窗口的中央部件,然后创建了一个按钮,并将按钮添加到QWidget中。

weixin_49520696的博客 3337

快速掌握Pyqt5的10种容器(Containers)

下面将提供一些简单的例子,展示PyQt5中不同种类容器的基本用法。

weixin_49520696的博客 3103

Python PyQt GUI编程:QMdiArea多文档界面实现

在上面的代码中,我们实现了两个槽函数new_document()和close_document(),分别对应新建文档和关闭文档的动作。在new_document()函数中,我们创建了一个新的QMdiSubWindow,并设置它的标题和部件,并将其添加到QMdiArea中。该部件可以将多个子窗口放入一个主窗口中,用户可以方便地在多个文档之间切换,增强了程序的可操作性和用户体验。在上述代码中,我们创建了一个QMdiArea作为主窗口,并循环创建了三个QMdiSubWindow作为子窗口。

BUG?不存在的! 332

PyQt学习笔记:QMdiArea多文档界面与QMdiSubWindow子窗口

在构造函数中,我们创建了一个QMdiArea对象self.mdi_area,并通过setCentralWidget()方法将其设置为主窗口的中心部件。然后,我们调用create_sub_window()方法创建一个QMdiSubWindow对象,并设置其属性,最后将其添加到QMdiArea中并显示出来。在构造函数中,我们创建了一个QMdiArea对象self.mdi_area,并通过setCentralWidget()方法将其设置为主窗口的中心部件。与代码文件放置在同一目录下,以便正确设置子窗口的图标。

ByteHackerX的博客 464

【Qt笔记】QMdiArea控件详解

QMdiArea是Qt框架中的一个重要控件,它提供了一个区域用于显示和管理多个MDI(Multiple Document Interface,多文档界面)子窗口。

qq_52924376的博客 2340

PyQt5高级界面控件之QMidArea Python

在上述代码中,我们定义了一个MainWindow类,它是继承自QMainWindow的自定义主窗口。在initUI方法中,我们创建了一个QMdiArea控件,并将其设置为主窗口的中心部件。然后,我们通过createMenu方法创建了一个简单的文件菜单,并添加了一个动作来新建子窗口。本文将介绍如何使用PyQt5中的QMidArea控件来实现多文档界面,并提供相应的Python源代码示例。在本文中,我们介绍了如何使用PyQt5中的QMidArea控件来创建多文档界面应用程序。

code88888的博客 656

【pyqt5学习】——containers相关控件(tab widget、scroll area、stack widget、tool box、MDI area、dock widget)

目录 1、tab widget 2、scroll area 2.1 使用方法 Step1.拖入QScrollArea ​Step2.改变widget控件布局 ​Step3.设置scrollAreaWidgetContents大小 3、Tool Box 4、Stacked Widget 4.1 案例展示 5、frame 6、MDI AREA 7、dock widget 7.1 悬浮状态 7.2 吸附状态 containers是所有容器的统称,主要是为了容纳不同的对象类型...

python_AI_fans的博客 4581

PyQt学习笔记:QMdiArea多文档界面和QMdiSubWindow子窗口的属性和操作方法

QMdiArea提供多文档用户界面,即一个主窗口可以打开多个子窗口,每个子窗口可以装载不同的文档或视图。QMdiSubWindow则是QMdiArea中的子窗口,可以在其中嵌入各种QWidget及其子类的对象。以上是关于QMdiArea和QMdiSubWindow的属性和操作方法的介绍,希望能对读者在PyQt GUI编程中使用QMdiArea和QMdiSubWindow提供帮助。PyQt学习笔记:QMdiArea多文档界面和QMdiSubWindow子窗口的属性和操作方法。

code_welike的博客 642

PyQt入门学习:QMdiArea多文档界面部件详解及编程开发案例

在该类的构造函数中,创建了一个QMdiArea对象,并将其设置为主窗口的中央部件。接着,通过定义create_actions()和create_menus()方法,创建了两个菜单动作,并将它们添加到文件菜单中。在new_file()方法中,我们创建了一个新的子窗口(QTextEdit),并将其添加到QMdiArea中。通过点击菜单中的"新建"动作,可以创建一个新的子窗口;最后,在主程序的入口处创建了一个QApplication对象,并将MainWindow实例化为主窗口,并显示出来。

BugHunterX的博客 338

第15.36节 PyQt(Python+Qt)入门学习:containers容器类部件QFrame框架部件介绍

一、概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有如下: 容器中的Frame为一个矩形的框架对象,对应类QFrame,QFrame类是PyQt中带框架部件的所有类的基类,如菜单、进度条、Label标签等。QFrame类除了派生子类外,也可以直接用于创建没有任何内容的简单占位符框架,用于占用一部分空间。 二、属性和方法 QFrame的方法和基本都是...

老猿Python 3153

Qt多文档界面核心:QMdiArea全面详解与实战指南

本文全面介绍了Qt中QMdiArea组件的使用方法,主要包括:1)基本概念,对比MDI与SDI界面;2)核心功能实现,如窗口创建、排列和管理;3)高级特性,包括自定义样式、文件操作集成;4)性能优化技巧和用户体验提升方案。文章提供了一个完整的MDI文本编辑器案例,涵盖从基础搭建到信号处理、内存管理等实践细节,并总结了常见问题的解决方案。通过系统学习,开发者可以掌握构建功能完善的多文档应用程序的关键技术。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 1213

PyQt5中QMdiArea方法的使用

在界面设计中我们有时候需要打开多个窗口,但有时为了方便于比较数据,我们需要把多个窗口放到一个窗口中,这个时候就需要用QMdiArea()方法创建一个可以容纳多文档的窗口 方法 功能 QMdiArea() 创建一个可以容纳多窗口的对象 QMdiSubWindow() 创建一个子窗口 setWidget() 向窗口中添加控件 setWindowTitle() 设置窗口标题 ...

qq_45690024的博客 2092

C#实战:5分钟搞定Modbus RTU通讯(基于NModbus4库)

本文详细介绍了如何使用C#和NModbus4库快速实现Modbus RTU通讯,包括环境配置、核心功能实现、性能优化及常见问题排查。通过代码示例和实用技巧,帮助开发者高效完成工业自动化设备的数据采集与控制任务。

weixin_30689307的博客 467

微生物测序分析LEfSe

LEfse分析定义 LEfse分析即LDA Effect Size分析,可以实现多个分组之间的比较,还进行分组比较的内部进行亚组比较分析,从而找到组间在丰度上有显著差异的物种(即biomaker);

宁生信 5万+

主窗口(07):【类】QMdiArea [官翻]

文章目录详细说明公共类型enum AreaOptionenum ViewModeenum WindowOrder属性公共函数构造和析构属性相关子窗口选项重写的公共函数公共槽信号重写的受保护的函数受保护的槽演示代码 QMdiArea Class QMdiArea小部件提供了一个显示MDI窗口的区域。 Header #include < QMdiArea > qmake QT += widgets Inherits QAbstractScrollArea Inherit

读书笔记 3954

数字频率计设计中的常见误区:从VHDL代码到硬件实现的避坑指南

本文深入探讨了数字频率计从VHDL代码到FPGA硬件实现过程中的关键误区与解决方案。重点分析了闸门时间生成的精度与资源平衡、控制时序设计中的竞争冒险规避,以及如何利用EDA工具进行综合、时序约束与调试,确保设计稳定可靠。文章为开发者提供了从仿真成功到硬件可用的实战避坑指南。

spark7igniter的博客 213

PyQT之多窗口切换

最近做个软件,用PyQT写的,在实现菜单栏点击弹出新窗口的时候严重被卡壳,发现用WxPython的思想和方式来做完全无法实现。PyQT的中文资料实在是太少了。看了点英文资料和QT的资料,逆推PyQT的实现方法,总算搞定。下面是一个小demo。 主界面的代码如下所示: # -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui from di

sollor525的专栏 2万+

聚类教程:cisTopic——来自单细胞表观基因组学数据的顺式调控主题的概率建模

之前运行这步的时候报错了如下: 后来发现原因是Ubuntu自动把R包更新到4.2版本,但是Rstudio版本没有更新,更新Rstudio即可,更新Rstudio的教程看此教程:。

watermel__的博客 1051

智能车图像处理12-进阶篇4--环岛辅助判断条件

主函数: 第6行: 含义是当前需要不在坡道和车库状态 第11-12行 : 寻找一下环岛的双断点(在辅助函数中) 第16-66行: 当左右线的方差满足一边很大,一边很小时,truepianfangflag /truepianfangflagforleft 置1,在环岛的判断中使用。 辅助函数: 双断点函数(左与右相似,以做为例): 第13-28行: 第一处断点 第29-40行: 第一处断点后 连续边线 第41-52行: 第一处连续后,第二处断点 第53-64行: 第二处断点后,第二处

taiyuezyh的博客 1万+

在QT Designer中怎么让mdiArea中的子窗口随着主窗口的伸缩而随之伸缩呢(并且子窗口的控件也会随着伸缩)?

线上效果图: 这是两个窗体,外面的是QMainWindow,里面的是QWidget 然后我把外面的窗体拉大,结果: 里面的子窗体也随着外面的主窗体拉伸而随之拉伸。 步骤如下: 打开QT Designer,然后新建一个QMainWindow,拖动MdiArea在其上 右键新建一个子窗口 再往子窗口上添加你想要添加的控件,在这里我添加了一个TableView 现在准备工作全部做完,进入重点,第一步想让子窗口中的控件随着子窗口的伸缩而随之伸缩,则需要对他进行Layout布局,选中MdiArea然后选择"

weixin_43356308的博客 2777

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

《Python Qt GUI与数据可视化编程》第6章 对话框与多窗口设计

第6章 对话框与多窗口设计 本章介绍多窗口的设计和调用问题,包括PyQt5标准对话框的使用,自定义对话框的设计和使用,如何在主窗口和对话框之间传递数据,如何设计类似于多页浏览器的多窗口程序,如何设计标准MDI(Multiple Document Interface)应用程序等问题。 6.1 标准对话框 PyQt5为应用程序设计提供了一些常用的标准对话框,如打开文件对话框、选择颜色对话框、信息...

HongAndYi的博客 2744

我的AI个人公司成立:基于Skills与Qwen大模型的智能问答平台实战开发+龙虾团队

微学AI推出数字员工矩阵,包含10个核心AI角色(总经理、秘书、工程师等),每个角色具备专属技能模块。系统采用FastAPI+Vue3技术栈,核心功能包括:基于SkillLoader的动态技能管理(支持脚本执行和文档加载)、WebSocket流式输出、多轮对话上下文管理。通过模块化架构实现AI自驱协作,可自主完成从需求分析到开发落地的全流程。项目亮点在于声明式技能配置和实时交互能力,打破传统办公壁垒,提升工作效率。

微学AI的博客 1625

语言大模型之Tokenization的深入理解

Tokenization(分词)是自然语言处理(NLP)中一个非常重要的步骤,它的目标是将文本转换为模型可以理解的格式。对于像GPT、BERT等大型预训练模型来说,tokenization决定了文本如何转化为数字表示,从而影响模型在不同任务中的表现。接下来我会深入介绍tokenization的过程、不同的tokenization方法,以及它与模型微调(fine-tuning)之间的关系。

JustinMars的博客 342
上一篇: PyQt(Python+Qt)学习随笔:QMdiArea多文档界面部件的subWindowActivated信号
下一篇: PyQt(Python+Qt)学习随笔:使用QFontDialog.getFont交互设置应用或部件的字体
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值