PyQt6第五章容器布局之5.2窗口布局(5.2.3多文档界面:MDI)

这段代码展示了如何使用Python的PyQt6库创建一个MDI应用程序,包括QMdiArea和QMdiSubWindow类的方法,如添加、删除和布局子窗口,以及通过菜单操作实现窗口堆叠和平铺。
摘要由CSDN通过智能技术生成
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界面允许用户在一个主窗口中管理多个子窗口。此程序中,用户可以执行以下操作:

  1. 通过菜单栏的“新建”选项,在主窗口的MDI区域内创建新的子窗口,每个子窗口包含一个文本编辑控件。
  2. 通过菜单栏的“平铺”选项,将MDI区域内的所有子窗口以平铺的方式排列显示。
  3. 通过菜单栏的“级联”选项,将MDI区域内的所有子窗口以级联的方式排列显示。

使用的布局和控件

  • QMainWindow:主窗口类,提供了一个标准的应用程序主窗口,包含菜单栏、工具栏等。
  • QMdiArea:多文档界面区域类,用于容纳多个QMdiSubWindow对象。
  • QMdiSubWindow:多文档界面子窗口类,每个QMdiSubWindow对象可以包含一个QWidget作为其内容。
  • QTextEdit:文本编辑控件,用于在子窗口中显示和编辑文本。
  • QMenuBar:菜单栏控件,用于显示一系列的菜单。
  • QAction:动作类,用于定义菜单栏或工具栏中的项,并可以绑定到槽函数。

关键语句

  1. self.mdi = QMdiArea():创建一个QMdiArea对象,用于容纳多个子窗口。
  2. self.setCentralWidget(self.mdi):将QMdiArea设置为MainWindow的中心部件。
  3. file.addAction('新建')file.addAction('平铺')file.addAction('级联'):在菜单栏中添加三个QAction。
  4. file.triggered[QAction].connect(self.actionFunc):将QAction的触发信号连接到actionFunc槽函数。
  5. sub = QMdiSubWindow():创建一个QMdiSubWindow对象。
  6. sub.setWidget(QTextEdit()):设置QMdiSubWindow的内部控件为QTextEdit
  7. self.mdi.addSubWindow(sub):将子窗口添加到MDI区域。
  8. self.mdi.cascadeSubWindows() 和 self.mdi.tileSubWindows():分别用于以级联和平铺的方式排列MDI区域中的子窗口。

这段代码使用信号和槽机制(triggered[QAction].connect(self.actionFunc))来处理用户交互,当用户点击菜单栏中的某个选项时,会触发相应的槽函数actionFunc,从而执行相应的操作(新建、平铺或级联子窗口)。这是Qt框架中实现事件驱动的典型方式。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值