Pyqt 简明教程

PyQt - Multiple Document Interface

典型的 GUI 应用程序可能有多个窗口。标签式和小部件可随时激活一个这样的窗口。但是,很多时候此方法可能没有用,因为其他窗口的视图被隐藏了。

同时显示多个窗口的一种方法是将它们创建为独立窗口。这称为 SDI(单文档界面)。这需要更多的内存资源,因为每个窗口可能都有自己的菜单系统、工具栏等。

MDI(多文档界面)应用程序消耗更少的内存资源。子窗口相对于彼此放置在主容器中。容器小部件称为 QMdiArea

QMdiArea 小部件通常占据 QMainWondow 对象的中央小部件。此区域中的子窗口是 QMdiSubWindow 类的实例。可以将任何 QWidget 设置为子窗口对象的内部小部件。MDI 区域中的子窗口可以以层叠或平铺方式排列。

下表列出了 QMdiArea 类和 QMdiSubWindow 类的重要方法 -

Sr.No.

Methods & Description

1

addSubWindow() 将窗口小部件添加为 MDI 区域中的一个新子窗口

2

removeSubWindow() 移除作为子窗口的内部窗口窗口小部件

3

setActiveSubWindow() Activates a subwindow

4

cascadeSubWindows() 以级联方式排列 MDiArea 中的子窗口

5

tileSubWindows() 以平铺方式排列 MDiArea 中的子窗口

6

closeActiveSubWindow() Closes the active subwindow

7

subWindowList() 返回 MDI 区域中的子窗口列表

8

setWidget() 设置一个 QWidget 作为 QMdiSubwindow 实例的内部窗口小部件

QMdiArea 对象发出 subWindowActivated() 信号,而 QMdisubWindow 对象发出 windowStateChanged() 信号。

Example

在以下示例中,包含 QMainWindow 的顶级窗口有一个菜单和 MdiArea。

self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")

file.addAction("New")
file.addAction("cascade")
file.addAction("Tiled")

菜单的 Triggered() 信号连接到 windowaction() 函数。

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

菜单的新操作向 MDI 区域中添加子窗口,其标题有一个递增的数字。

MainWindow.count = MainWindow.count+1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("subwindow"+str(MainWindow.count))
self.mdi.addSubWindow(sub)
sub.show()

菜单的级联和平铺按钮分别以级联和平铺方式排列当前显示的子窗口。

完整代码如下所示:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MainWindow(QMainWindow):
   count = 0

   def __init__(self, parent = None):
      super(MainWindow, self).__init__(parent)
      self.mdi = QMdiArea()
      self.setCentralWidget(self.mdi)
      bar = self.menuBar()

      file = bar.addMenu("File")
      file.addAction("New")
      file.addAction("cascade")
      file.addAction("Tiled")
      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.setWidget(QTextEdit())
      sub.setWindowTitle("subwindow"+str(MainWindow.count))
      self.mdi.addSubWindow(sub)
      sub.show()

   if q.text() == "cascade":
      self.mdi.cascadeSubWindows()

   if q.text() == "Tiled":
      self.mdi.tileSubWindows()

   def main():
      app = QApplication(sys.argv)
      ex = MainWindow()
      ex.show()
      sys.exit(app.exec_())

   if __name__ == '__main__':
      main()

上述代码生成以下输出 -

multiple document interface output1
multiple document interface output2
multiple document interface output3