在这篇Python文章中,我们将学习使用Pyside2实现的多窗口接口。

为此,我们使用QMdiArea类。 QMdiArea小部件提供了一个在其中显示MDI窗口的区域。因此QMdiArea本质上就像MDI窗口的窗口管理器一样起作用。例如,它绘制自己管理的窗口,并以层叠或平铺模式排列它们。 QMdiArea通常用作QMainWindow中的中心小部件来创建MDI应用程序,但也可以放置在任何布局中。

什么是MDI应用程序?

在开发GUI应用程序时,有时需要同时打开多个文档来处理它们,对于这类功能,我们将使用MDI方法。在多文档接口(MDI)应用程序中,中心小部件由多个实例实例化。所有这些小部件都将在主窗口内相互关联,并共享公共菜单栏、工具栏和其他组件。与SDI应用程序相比,MDI应用程序使用较少的资源。MDI应用程序提供了一个额外的菜单来在窗口之间进行管理,因为底层操作系统不控制在窗口之间进行切换。

这是使用Pyside2的Python多文档接口的完整代码

from PySide2.QtWidgets import QApplication, QMainWindow, QMdiArea, QMdiSubWindow, QTextEdit, QAction
import sys
from PySide2.QtGui import QIcon

#我们的主窗口类
class WindowWidget(QMainWindow):
    count =0
    def __init__(self):
        super().__init__()

        self.init_ui()

    def init_ui(self):

        #此窗口的标题、位置和图标
        self.setWindowTitle("Pyside2 MDI窗体 - www.linuxmi.com")
        self.setGeometry(100,100, 900, 500)

        #创建MDI对象
        self.mdi = QMdiArea()
        self.setCentralWidget(self.mdi)

        #我们的菜单栏
        menu_bar = self.menuBar()

        #我们的菜单项
        file = menu_bar.addMenu("文件")
        file.addAction("新建")
        file.addAction("层叠")
        file.addAction("平铺")

        file.triggered[QAction].connect(self.window_triggered)

        self.show()

    def window_triggered(self, p):

        if p.text() == "新建":
            WindowWidget.count = WindowWidget.count + 1
            sub = QMdiSubWindow()
            sub.setWidget(QTextEdit())
            sub.setWindowTitle("子窗口 " + str(WindowWidget.count))
            self.mdi.addSubWindow(sub)
            sub.show()

        if p.text() == "层叠":
            self.mdi.cascadeSubWindows()

        if p.text() == "平铺":
            self.mdi.tileSubWindows()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = WindowWidget()
    sys.exit(app.exec_())

这是用来设置窗口标题的

        self.setWindowTitle("Pyside2 MDI窗体 - www.linuxmi.com")

在这里,我们设置了窗口的几何形状,比如x,y窗口的位置

窗户的宽度和高度。

        self.setGeometry(100,100, 900, 500)

在这里,我们创建了QMdiArea的对象,还将QMdiArea设置为主窗口的中心部件。

        self.mdi = QMdiArea()
        self.setCentralWidget(self.mdi)

这些是我们的菜单项。

        file = menu_bar.addMenu("文件")
        file.addAction("新建")
        file.addAction("层叠")
        file.addAction("平铺")

此方法用于创建子窗口,我们将创建三种不同类型的子窗口,然后在mdi区域中添加子窗口。

    def window_triggered(self, p):

        if p.text() == "新建":
            WindowWidget.count = WindowWidget.count + 1
            sub = QMdiSubWindow()
            sub.setWidget(QTextEdit())
            sub.setWindowTitle("子窗口 " + str(WindowWidget.count))
            self.mdi.addSubWindow(sub)
            sub.show()

        if p.text() == "层叠":
            self.mdi.cascadeSubWindows()

        if p.text() == "平铺":
            self.mdi.tileSubWindows()

什么是QMdiSubWindow ?

QMdiSubWindow类为QMdiArea提供了一个子窗口类。因此,QMdiSubWindow表示QMdiArea中的一个顶级窗口,它由一个带有窗口装饰的标题栏、一个内部小部件以及(取决于当前样式)一个窗口框架和一个大小控件组成。QMdiSubWindow有自己的布局,它由标题栏和内部小部件的中心区域组成。

最后,我们进入了应用程序的主循环。事件处理从这里开始。我们还创建了窗口和QApplication的对象。

    app = QApplication(sys.argv)
    window = WindowWidget()
    sys.exit(app.exec_())

现在运行完整的代码,结果如下。

发表评论

电子邮件地址不会被公开。 必填项已用*标注