我设置了QFileSystemModel根路径,然后将其设置为QTreeView模型,但是,如果我尝试查找特定文件的索引,它将得到D:
我确定文件在那里!
self.model = QtWidgets.QFileSystemModel()
self.model.setNameFilters(['*.ma'])
self.model.setFilter(QtCore.QDir.Files)#QtCore.QDir.AllDirs | QtCore.QDir.NoDotAndDotDot | QtCore.QDir.AllEntries)
self.model.setNameFilterDisables(False)
self.model.setRootPath(path)
self.tree_local_file.setModel(self.model)
self.tree_local_file.setRootIndex(self.model.index(path))
# ...
# then
# ...
for i in range(self.model.rowCount()):
index = self.model.index(i, 0)
file_name = str(self.model.fileName(index))
file_path = str(self.model.filePath(index))
print(file_path) # this gave me -> D:/
if file_name == master_file_name:
self.tree_local_file.setCurrentIndex(index)
self.open_file()
break
# or
index = (self.model.index(master_file_name[1]))
print(self.model.filePath(index)) # this is giving me nothing
最佳答案
如果docs被检查:
QModelIndex QFileSystemModel :: setRootPath(const QString&newPath)
通过以下方式将模型正在监视的目录设置为newPath
在其上安装文件系统监视程序。对文件和
该目录中的目录将反映在模型中。
如果更改路径,将发出rootPathChanged()信号。
注意:此功能不会更改模型的结构或
修改视图可用的数据。换句话说,
模型未更改为仅包含文件和目录中的文件和目录
文件系统中newPath指定的目录。
(强调我的)
据了解,模型的根目录从未改变,因此,如果要访问rootPath下的项目,则必须获取与该路径关联的QModelIndex,然后获取子目录。
另一方面,QFileSystemModel在另一个线程中执行其任务以避免对GUI的某些阻塞,因此在更改rootPath时您将无法获得足够的路由,但至少必须等待发出directoryLoaded信号以指示工作已完成在线程上完成。
考虑到上述可能的解决方案是:
from PyQt5 import QtCore, QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.tree_local_file = QtWidgets.QTreeView()
self.setCentralWidget(self.tree_local_file)
path = "/foo/path/"
self.model = QtWidgets.QFileSystemModel()
self.model.setNameFilters(["*.ma"])
self.model.setFilter(
QtCore.QDir.Files
) # QtCore.QDir.AllDirs | QtCore.QDir.NoDotAndDotDot | QtCore.QDir.AllEntries)
self.model.setNameFilterDisables(False)
self.model.setRootPath(path)
self.tree_local_file.setModel(self.model)
self.tree_local_file.setRootIndex(self.model.index(path))
self.model.directoryLoaded.connect(self.onDirectoryLoaded)
@QtCore.pyqtSlot()
def onDirectoryLoaded(self):
root = self.model.index(self.model.rootPath())
for i in range(self.model.rowCount(root)):
index = self.model.index(i, 0, root)
file_name = self.model.fileName(index)
file_path = self.model.filePath(index)
print(file_path)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())