PyQt5 TreeView scrollTo方法失效问题求助
TreeView中scrollTo方法无效的解决方案
你的问题出在两个核心点:
- 调用顺序错误:你先执行了
scrollTo,之后又调用了expandAll(),这个操作会重新展开所有节点,直接打乱之前的滚动位置。 - QFileSystemModel的异步加载特性:文件系统模型是异步加载目录数据的,初始化阶段目标目录的索引可能还没完全加载完成,此时调用scrollTo自然不会生效。
修复步骤:
- 调整操作顺序,先完成所有展开操作,再设置选中并滚动。
- 监听
directoryLoaded信号,确保目标目录及其父目录加载完成后,再执行选中和滚动操作,避免异步加载导致的索引无效问题。
修改后的完整代码:
import sys from PyQt5.QtWidgets import QApplication, QFileSystemModel, QTreeView, QWidget, QVBoxLayout from PyQt5.QtCore import QDir, Qt, QAbstractItemView class App(QWidget): def __init__(self): super().__init__() self.title = 'TEST' self.left = 0 self.top = 0 self.width = 640 self.height = 480 self.last_opened_folder = "E:/z/1" # 替换为你的深层目录 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # 初始化文件系统模型 self.model = QFileSystemModel(self) self.model.setRootPath("") self.model.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) # 初始化TreeView self.tree = QTreeView() self.tree.setModel(self.model) # 先设置TreeView的格式 self.tree.setColumnWidth(0, 450) self.tree.setColumnHidden(1, True) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.sortByColumn(0, Qt.AscendingOrder) # 监听目录加载完成信号,确保数据就绪后再操作 self.model.directoryLoaded.connect(self.on_directory_loaded) # 先展开所有节点(如果不需要全展开,也可以只展开目标路径的父节点) self.tree.expandAll() # 布局设置 windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) self.show() def on_directory_loaded(self, path): # 当目标目录加载完成后执行选中和滚动 if path == self.last_opened_folder or path == QDir.rootPath(): target_index = self.model.index(self.last_opened_folder) if target_index.isValid(): self.tree.setCurrentIndex(target_index) self.tree.scrollTo(target_index, QAbstractItemView.PositionAtBottom) # 确保目标路径的所有父节点都展开 parent_index = target_index.parent() while parent_index.isValid(): self.tree.setExpanded(parent_index, True) parent_index = parent_index.parent() if __name__ == '__main__': app = QApplication(sys.argv) ex = App() sys.exit(app.exec_())
关键改动说明:
- 将
expandAll()移到scrollTo之前,避免展开操作覆盖滚动位置。 - 通过
directoryLoaded信号等待目录加载完成,确保目标索引有效后再执行选中和滚动。 - 额外添加了展开目标目录所有父节点的逻辑,确保目标节点处于可见的层级中。
内容的提问来源于stack exchange,提问作者Edward Webb
相关产品推荐
相关产品推荐

