PyQt5中QTreeView与QFileSystemModel识别.lnk快捷方式文件问题
解决QFileSystemModel解析.lnk快捷方式为目标路径的问题
核心解决方案:禁用快捷方式解析
QFileSystemModel默认会自动解析Windows下的.lnk快捷方式(视为符号链接),导致filePath()和fileName()返回目标路径而非快捷方式本身。只需调用模型的setResolveSymlinks(False)方法,即可禁用该行为,让模型将.lnk文件当作普通文件处理:
from PyQt5.QtWidgets import QFileSystemModel, QTreeView from PyQt5.QtWidgets import QApplication import sys app = QApplication(sys.argv) tree_view = QTreeView() model = QFileSystemModel() model.setResolveSymlinks(False) # 禁用快捷方式解析 model.setRootPath("C:/") tree_view.setModel(model) tree_view.show() # 测试获取选中项 def on_selection_changed(selected, deselected): indexes = selected.indexes() if indexes: index = indexes[0] file_path = model.filePath(index) file_name = model.fileName(index) print(f"路径:{file_path},文件名:{file_name}") tree_view.selectionModel().selectionChanged.connect(on_selection_changed) sys.exit(app.exec_())
为什么之前的自定义模型无效?
你之前重写flags()方法的思路错误,因为当模型默认解析快捷方式时,self.filePath(index)返回的已经是目标路径(而非.lnk文件本身),所以filePath.endswith('.lnk')永远不会成立,自然无法修改flags。必须先禁用解析,才能让模型识别到.lnk文件本身。
备选方案:自定义模型重写filePath方法
如果需要保留部分解析逻辑,可自定义QFileSystemModel并重写filePath()和fileName()方法,直接获取.lnk文件的原始路径:
from PyQt5.QtWidgets import QFileSystemModel from PyQt5.QtCore import QModelIndex, Qt class CustomFileSystemModel(QFileSystemModel): def filePath(self, index: QModelIndex) -> str: # 获取模型存储的原始未解析路径 original_path = super().filePath(index) # 若为.lnk文件,直接返回原始路径 if original_path.endswith('.lnk'): return original_path return super().filePath(index) def fileName(self, index: QModelIndex) -> str: file_info = self.fileInfo(index) original_name = file_info.fileName() # 若为.lnk文件,返回原始文件名 if original_name.endswith('.lnk'): return original_name return super().fileName(index) # 使用示例 model = CustomFileSystemModel() model.setRootPath("C:/")
内容的提问来源于stack exchange,提问作者robin
相关产品推荐
相关产品推荐

