第二十一章 拆分窗口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