QMdiArea类和 QMdiSubWindow 类中的常用方法如下:
addSubWindow():添加在MDI区域作为一个新的子窗口
removeSubWindow():删除一个子窗口
setActiveSubWindow():激活一个子窗口
cascadeSubWindows():安排子窗口在MD1区域级联显示
tileSubWindows():安排予窗口在MDI区域平铺显示
closeActiveSubWindow():关闭活动的子窗口
subWindowList():返回MDI区域的子窗口列表
setWidget():设置窗口作为QMdiSubwindow实例对象的内部控件
【例5.6】多重文档界面设计。创建口主窗口,在主窗口创建主菜单,菜单项包括创建子窗口、子窗口堆叠和子窗口平铺。编写单击菜单项信号对应槽函数,实现需要功能。
运行程序,单击“窗口”菜单中“新建子窗口”项3次,创建3个子窗口,显示如图 (a)所示。单击“窗口”菜单中“窗口堆叠”项,显示如图 (b)所示。单击“窗口”菜单中“窗口平铺”项,显示如图 (c)所示。
import sys # 导入Python的系统模块,用于获取命令行参数,以及在退出时管理Python解释器。
from PyQt6.QtWidgets import * # 从PyQt6的QtWidgets模块中导入所有类和函数。
from PyQt6.QtGui import * # 从PyQt6的QtGui模块中导入所有类和函数。
class MainWindow(QMainWindow): # 定义一个名为MainWindow的类,它继承自QMainWindow。
count = 0 # 定义一个类变量count,用于记录子窗口的数量,初始化为0。
def __init__(self, parent=None): # 初始化方法,当创建MainWindow类的实例时调用。
super(MainWindow, self).__init__(parent) # 调用父类QMainWindow的初始化方法。
self.mdi = QMdiArea() # 创建一个QMdiArea对象,用于容纳多个子窗口。
self.setCentralWidget(self.mdi) # 将mdi设置为MainWindow的中心部件。
bar = self.menuBar() # 获取MainWindow的菜单栏对象。
file = bar.addMenu('窗口') # 在菜单栏中添加一个名为“窗口”的菜单。
file.addAction('新建') # 在“窗口”菜单中添加一个名为“新建”的QAction。
file.addAction('平铺') # 在“窗口”菜单中添加一个名为“平铺”的QAction。
file.addAction('级联') # 在“窗口”菜单中添加一个名为“级联”的QAction。
# 点击QAction时绑定自定义的槽函数actionFunc
file.triggered[QAction].connect(self.actionFunc) # 当QAction被触发时,调用actionFunc方法。
self.setWindowTitle("MDI测试") # 设置MainWindow的窗口标题为“MDI测试”。
def actionFunc(self, fAction): # 定义一个槽函数actionFunc,接收一个QAction参数。
if fAction.text() == '新建': # 检查触发的QAction的文本是否为“新建”。
MainWindow.count = MainWindow.count + 1 # 如果是“新建”,则增加子窗口计数。
sub = QMdiSubWindow() # 创建一个QMdiSubWindow对象,用于容纳子窗口的内容。
sub.setWidget(QTextEdit()) # 设置子窗口的内部控件为一个QTextEdit对象。
sub.setWindowTitle('子窗口' + str(MainWindow.count)) # 设置子窗口的标题。
self.mdi.addSubWindow(sub) # 将子窗口添加到mdi区域中。
sub.show() # 显示子窗口。
if fAction.text() == '级联': # 检查触发的QAction的文本是否为“级联”。
self.mdi.cascadeSubWindows() # 如果是“级联”,则安排mdi区域中的子窗口以级联方式显示。
if fAction.text() == '平铺': # 检查触发的QAction的文本是否为“平铺”。
self.mdi.tileSubWindows() # 如果是“平铺”,则安排mdi区域中的子窗口以平铺方式显示。
if __name__ == '__main__': # 检查当前模块是否作为主程序运行。
app = QApplication(sys.argv) # 创建一个QApplication对象,传入命令行参数。
demo = MainWindow() # 创建一个MainWindow对象。
demo.show() # 显示MainWindow窗口。
sys.exit(app.exec()) # 进入应用程序的事件循环,并等待用户交互,最后退出应用程序。
功能描述:
这两段代码结合后实现了一个基本的MDI(Multiple Document Interface,多文档界面)应用程序。MDI界面允许用户在一个主窗口中管理多个子窗口。此程序中,用户可以执行以下操作:
- 通过菜单栏的“新建”选项,在主窗口的MDI区域内创建新的子窗口,每个子窗口包含一个文本编辑控件。
- 通过菜单栏的“平铺”选项,将MDI区域内的所有子窗口以平铺的方式排列显示。
- 通过菜单栏的“级联”选项,将MDI区域内的所有子窗口以级联的方式排列显示。
使用的布局和控件:
QMainWindow
:主窗口类,提供了一个标准的应用程序主窗口,包含菜单栏、工具栏等。QMdiArea
:多文档界面区域类,用于容纳多个QMdiSubWindow
对象。QMdiSubWindow
:多文档界面子窗口类,每个QMdiSubWindow
对象可以包含一个QWidget作为其内容。QTextEdit
:文本编辑控件,用于在子窗口中显示和编辑文本。QMenuBar
:菜单栏控件,用于显示一系列的菜单。QAction
:动作类,用于定义菜单栏或工具栏中的项,并可以绑定到槽函数。
关键语句:
self.mdi = QMdiArea()
:创建一个QMdiArea
对象,用于容纳多个子窗口。self.setCentralWidget(self.mdi)
:将QMdiArea
设置为MainWindow
的中心部件。file.addAction('新建')
、file.addAction('平铺')
、file.addAction('级联')
:在菜单栏中添加三个QAction。file.triggered[QAction].connect(self.actionFunc)
:将QAction的触发信号连接到actionFunc
槽函数。sub = QMdiSubWindow()
:创建一个QMdiSubWindow
对象。sub.setWidget(QTextEdit())
:设置QMdiSubWindow
的内部控件为QTextEdit
。self.mdi.addSubWindow(sub)
:将子窗口添加到MDI区域。self.mdi.cascadeSubWindows()
和self.mdi.tileSubWindows()
:分别用于以级联和平铺的方式排列MDI区域中的子窗口。
这段代码使用信号和槽机制(triggered[QAction].connect(self.actionFunc)
)来处理用户交互,当用户点击菜单栏中的某个选项时,会触发相应的槽函数actionFunc
,从而执行相应的操作(新建、平铺或级联子窗口)。这是Qt框架中实现事件驱动的典型方式。