在这篇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_())
现在运行完整的代码,结果如下。