- PyQt 教程
- PyQt - 首頁
- PyQt - 簡介
- PyQt - 環境
- PyQt - Hello World
- PyQt - 主要類
- PyQt - 使用 Qt Designer
- PyQt - 元物件
- PyQt 訊號 & 槽
- PyQt - 訊號和槽
- PyQt - 支援和訊號
- PyQt - 未繫結和已繫結訊號
- PyQt - 使用 PyQtSignal 建立新訊號
- PyQt - 連線、斷開和發射訊號
- PyQt - 槽裝飾器
- PyQt - 槽連線
- PyQt 佈局
- PyQt - 佈局管理
- PyQt - QBoxLayout
- PyQt - QGridLayout
- PyQt - QFormLayout
- PyQt - QHBoxLayout
- PyQt - QVBoxLayout
- PyQt - QStackedLayout
- PyQt - QGraphicsGridLayout
- PyQt - QGraphicsAnchorLayout
- PyQt - QGraphicsLayout
- PyQt - QGraphicsLinearLayout
- PyQt 基本控制元件
- PyQt - 基本控制元件
- PyQt - Qlabel 控制元件
- PyQt - QLineEdit 控制元件
- PyQt - QPushButton 控制元件
- PyQt - QRadioButton 控制元件
- PyQt - QCheckBox 控制元件
- PyQt - QComboBox 控制元件
- PyQt - QSpinBox 控制元件
- PyQt - QMessageBox
- PyQt - QDialogButtonBox 控制元件
- PyQt - QFontComboBox 控制元件
- PyQt - QDoubleSpinBox 控制元件
- PyQt - QToolBox 控制元件
- PyQt - QDialog 類
- PyQt - QMessageBox
- PyQt - 多文件介面
- PyQt - 拖放
- PyQt 繪圖 API
- PyQt - 繪圖 API
- PyQt 資料庫
- PyQt - 資料庫處理
- PyQt 基礎
- PyQt - BrushStyle 常量
- PyQt - QClipboard
- PyQt - QPixmap 類
- PyQt 有用資源
- PyQt - 快速指南
- PyQt - 有用資源
- PyQt - 討論
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()
以上程式碼產生以下輸出: