一個典型的GUI應用程序可能有多個窗口,選項卡控件和堆棧窗口控件允許一次使用其中的一個窗口。然而,很多時候這種方法不是很有用,因為其他窗口的視圖是隱藏的一種同時顯示多個窗口的方法是,創建多個獨立的窗口,這些獨立的窗口被稱為SDI(Single Document Interface,單文檔界面),每個窗口都可以有自己的菜單系統、工具欄等。這需要占用較多的內存資源。
MDI (Multiple Document Interface,多文檔界面)應用程序占用較少的內存資源,子窗口都可以放在主窗口容器中,這個容器控件被稱為QMdiArea。
QMidArea控件通常占據在QMainWindow對象的中央位置,子窗口在這個區域是QMdiSubWindow類的實例,可以設置任何QWidget作為子窗口對象的內部控件,子窗口在MDI區域進行級聯排列布局。
QMdiArea類和QMdiSubWindow類中的常用方法如下表所示:
通過示例,了解QMdiArea類和QMdiSubWindow類多文檔界面的使用方法,效果如下所示:
示例中,主窗口QMainWindow擁有一個菜單控件和MidArea控件。當單擊菜單控件時觸發triggered信號,連接到槽函數windowaction()。當選擇菜單中的“New"動作時,會添加一個新的MDI,每個MDI都有標題,在主窗口內部會增加MDI的數量。當選擇菜單中的“cascade"和"Tiled"動作時,會在主窗口中顯示子窗口的排列方式:級聯顯示子窗口或平鋪顯示子窗口。
實現代碼如下所示:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets 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()
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = MainWindow()
demo.show()
sys.exit(app.exec_())