PyQt5 MDI多文档界面QMidArea详解与实战

山间有风
山间有风
发布时间:2026-10-13 | 1人浏览过
原创

本文深入解析PyQt5中的QMidArea控件,介绍MDI(多文档界面)与SDI的区别。通过代码实例演示如何创建子窗口、实现级联和平铺显示,并详细讲解菜单触发信号与槽函数的绑定逻辑,帮助开发者掌握多窗口应用开发技巧。

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

实现同时显示多个窗口的一种方式是创建多个独立窗口,这类窗口被称为SDI(Single Document Interface,单文档界面)。每个SDI窗口都拥有独立的菜单系统和工具栏,但这种设计会消耗较多的系统资源。

相比之下,MDI(Multiple Document Interface,多文档界面)应用程序占用的内存资源较少。在MDI架构中,子窗口被放置在主窗口的一个特定容器内,该容器控件即为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_())

级联显示

平铺显示

代码分析

在该示例中,主窗口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 相关产品和应用

全部下载

专题列表