PyQt - 多文件介面



一個典型的 GUI 應用程式可能有多個視窗。選項卡式和小部件允許一次啟用一個這樣的視窗。但是,很多時候這種方法可能不實用,因為其他視窗的檢視被隱藏。

同時顯示多個視窗的一種方法是將它們建立為獨立視窗。這稱為 SDI(單文件介面)。這需要更多的記憶體資源,因為每個視窗可能都有自己的菜單系統、工具欄等。

MDI(多文件介面)應用程式消耗更少的記憶體資源。子視窗在主容器內相互關聯地排列。容器小部件稱為QMdiArea

QMdiArea 小部件通常佔據 QMainWondow 物件的中心小部件。此區域中的子視窗是 QMdiSubWindow 類的例項。可以將任何 QWidget 設定為 subWindow 物件的內部小部件。MDI 區域中的子視窗可以以級聯或平鋪的方式排列。

下表列出了 QMdiArea 類和 QMdiSubWindow 類的重要方法:

序號 方法 & 描述
1

addSubWindow()

將小部件作為新子視窗新增到 MDI 區域

2

removeSubWindow()

刪除作為子視窗內部小部件的小部件

3

setActiveSubWindow()

啟用子視窗

4

cascadeSubWindows()

以級聯方式排列 MDiArea 中的子視窗

5

tileSubWindows()

以平鋪方式排列 MDiArea 中的子視窗

6

closeActiveSubWindow()

關閉活動子視窗

7

subWindowList()

返回 MDI 區域中的子視窗列表

8

setWidget()

將 QWidget 設定為 QMdiSubwindow 例項的內部小部件

QMdiArea 物件發出 subWindowActivated() 訊號,而 windowStateChanged() 訊號由 QMdisubWindow 物件發出。

示例

在以下示例中,包含 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
廣告

© . All rights reserved.