《快速掌握PyQt5》第二十一章 拆分視窗QSplitter
第二十一章 拆分視窗QSplitter
拆分視窗中可以新增許多子控制元件,各個子控制元件通過拆分線相互分隔開來,拖動該拆分線可以隨意改變子控制元件大小。
21.1 示例
下面我們將上一章中的QListView、QTreeView和QTableWidget放到拆分視窗中,三個檢視全都只用QDirModel來顯示檔案目錄。請看下方程式碼:
import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QSplitter, QListView, QTreeView, QTableView, QDirModel class Demo(QSplitter): # 1 def __init__(self): super(Demo, self).__init__() self.dir_model = QDirModel(self) # 2 self.list_view = QListView(self) # 3 self.tree_view = QTreeView(self) self.table_view = QTableView(self) self.list_view.setModel(self.dir_model) self.tree_view.setModel(self.dir_model) self.table_view.setModel(self.dir_model) self.tree_view.doubleClicked.connect(self.show_func) # 4 # self.setOrientation(Qt.Vertical) # 5 self.addWidget(self.list_view) self.addWidget(self.tree_view) self.insertWidget(0, self.table_view) self.setSizes([300, 200, 200]) print(self.count()) def show_func(self, index): self.list_view.setRootIndex(index) self.table_view.setRootIndex(index) if __name__ == '__main__': app = QApplication(sys.argv) demo = Demo() demo.show() sys.exit(app.exec_())
1. 繼承QSplitter;
2. 例項化QDirModel模型;
3. 分別例項化QListView、QTreeView和QTableView,然後將這三個檢視的模型設為dir_model;
4. 將QTreeView的doubleClicked訊號和自定義的槽函式連線起來,QtAssistant中對該訊號解釋如下:
所以我們知道每當雙擊時,被雙擊項的索引就會儲存在index中,而這個引數會傳給槽函式:
def show_func(self, index): self.list_view.setRootIndex(index) self.table_view.setRootIndex(index)
在槽函式中我們呼叫setRootIndex()並傳入index值,也就是說,每當我們雙擊QTreeView中的某項時,QListView和QTableView就會將該項的索引設為自身的根索引,並顯示相應的目錄結構;
5. 拆分視窗預設是水平的,可以呼叫setOrientation(Qt.Vertical)方法將其設為垂直方向。呼叫addWidget()方法將檢視新增到拆分視窗中。insrtWidget(int, widget)可以將控制元件插入到相應的位置,第一個引數為要插入的索引位置,第二個引數為控制元件。setSizes(iterable)可以設定各個子控制元件的寬度(如果拆分視窗為垂直方向的話,則該方法會設定高度)。count()方法返回拆分視窗中的控制元件數量。
執行截圖如下:
拖動拆分線可以隨意改變子控制元件大小:
21.2 小結
1. 可以把拆分拆分視窗當作一種特殊的佈局管理器來使用,讓介面各控制元件更有靈活性;
2. 要多使用QtAssistant進行查詢,比如某訊號是否可以傳引數。
----------------------------------------------------------------------
喜歡的小夥伴可以加入這個Python QQ交流群一起學習:820934083