【发布时间】:2021-11-13 13:29:55
【问题描述】:
我有一个Treeview(继承自QTreeView),型号为QFileSystemModel。这个Treeview 对象被添加到另一个带有QPushButton 的小部件中。该按钮将通过QFileDialog打开一个目录,并调用Treeview的set_directory方法。该方法将模型的根路径设置为所选目录,并将修改树视图的根索引。然后选择树视图中最顶部的项目。
但是,当第一次选择目录时,最上面的项目没有被选择。注释掉第 11 行:self.model.directoryLoaded.connect(self.set_directory),解决了这个问题。但这意味着set_directory 方法被调用了两次:
# default directory opened
<class 'NoneType'>
# open new directory, set_directory called twice
<class 'NoneType'>
<class 'PyQt5.QtWidgets.QFileSystemModel'>
如命令行输出所示,QModelIndex.model() 方法在第一次选择目录时返回 NoneType。如何在不调用两次set_directory 方法的情况下将树视图的当前索引设置为最顶部的项目?还有为什么QModelIndex模型在目录没有被访问的时候是NoneType?
下面的主脚本:
from PyQt5.QtWidgets import QPushButton, QTreeView, QFileSystemModel, QWidget, QFileDialog, QApplication, QHBoxLayout
import sys
class Treeview(QTreeView):
def __init__(self, parent=None):
super(QTreeView, self).__init__(parent)
self.model = QFileSystemModel()
self.setModel(self.model)
self.set_directory(".")
# self.model.directoryLoaded.connect(self.set_directory)
def set_directory(self, path):
self.setRootIndex(self.model.setRootPath(path))
self.setCurrentIndex(self.model.index(0, 0, self.rootIndex()))
print(type(self.model.index(0, 0, self.rootIndex()).model()))
class MainWidget(QWidget):
def __init__(self, parent=None):
super(QWidget, self).__init__(parent)
self.tview = Treeview(self)
vlayout = QHBoxLayout(self)
vlayout.addWidget(self.tview)
open_button = QPushButton(self)
open_button.clicked.connect(self.open_dir)
vlayout.addWidget(open_button)
def open_dir(self):
filepath = QFileDialog.getExistingDirectory(self)
if filepath:
self.tview.set_directory(filepath)
if __name__ == '__main__':
app = QApplication(sys.argv)
widget = MainWidget()
widget.show()
sys.exit(app.exec_())
【问题讨论】:
标签: python python-3.x pyqt pyqt5