默认情况下,如果模型将其当前索引初始化到当前目录,则可能会导致第一个问题。这意味着如果你设置它
再一次
对于相同的索引,不会发出行更改信号(因为没有更改)。这可以通过直接调用行更改处理程序来解决:
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
...
focus_path = QDir.currentPath()
focus_index = self.my_model.index(focus_path)
self.my_view.setCurrentIndex(focus_index)
self.current_row_changed()
def current_row_changed(self):
index = self.my_view.currentIndex()
self.my_view.scrollTo(index, QAbstractItemView.EnsureVisible)
self.my_view.resizeColumnToContents(0)
...
关于第二个问题:当你打电话
scrollTo
,它可能需要扩展多个目录才能选择所需的索引。这显然会更改第一列的宽度,因此应始终调用
resizeColumnToContents
之后
为了得到正确的宽度。
更新
:
我认为还有一个问题是由时间问题引起的。这个
QFileSystemModel
必须在某种程度上异步工作,因为它必须从操作系统请求资源,然后等待响应。另外,在得到响应之前,它不能提前确切知道它将接收多少数据,因为文件系统可能在等待时被更新了。可能,响应可能包括来自包含数千个文件的大型目录的数据。因此,为了保持图形用户界面的响应性,数据被成批处理,其大小足以填充当前视图。如果设置了当前索引
在窗口显示和所有小部件完全布局之前
,不能保证视图能够正确调整其列的大小。
这可以通过一个具有很小延迟的一次性计时器显式地重新调用行更改处理程序来解决。这将允许视图正确地重新计算列宽:
...
focus_path = QDir.currentPath()
focus_index = self.my_model.index(focus_path)
self.my_view.setCurrentIndex(focus_index)
QTimer.singleShot(50, self.current_row_changed)
def current_row_changed(self):
index = self.my_view.currentIndex()
self.my_view.scrollTo(index, QAbstractItemView.EnsureVisible)
self.my_view.resizeColumnToContents(0)