文件更改时QFileSystemModel不更新

2024-09-25 10:32:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了QFileSystemModel不显示文件更改的问题。第一次创建文件时,它会立即显示出来。但是当文件本身发生变化时,大小和时间戳不会更新。我曾多次尝试强制模型更新,但都没有成功。我所做的最好的就是完全替换这个模型。虽然这会导致此错误:

QSortFilterProxyModel: index from wrong model passed to mapToSource

下面的测试代码创建空目录的表视图。左键创建一个文件(食品.txt)单击时。连续单击将数据追加到文件。我的理解是QFileSystemModel不需要刷新,但是第二个按钮是我的尝试。在

如果你能帮助我做错事,我将不胜感激!在

^{pr2}$

Tags: 文件tofrom模型indexmodel错误时间
2条回答

由于qtv5.9.4可以设置环境变量QT_FILESYSTEMMODEL_WATCH_FILES,因此可以在changelog中阅读更多关于它的信息:

[QTBUG-46684] It is now possible to enable per-file watching by setting the environment variable QT_FILESYSTEMMODEL_WATCH_FILES, allowing to track for example changes in file size.

有几件事:

  • 目前您需要设置它before initializing the model,之后您可以毫无问题地将其设置到另一个文件夹。在
  • 不过,请注意,这个特性是以潜在的重载为代价的。在

更新

从Qt-5.9.4开始,QT_FILESYSTEMMODEL_WATCH_FILES环境变量可用于打开每个文件监视(请参见QTBUG-46684)。在模型开始缓存有关文件的信息之前,需要将该值设置为非空值。但请注意,这将为遇到的每个文件添加一个文件监视程序,因此这可能使其成为expensive solution on some systems。在

原始答案留在下面作为对问题的解释。在


此问题是由长期存在的Qt错误引起的:QTBUG-2276。不幸的是,目前看来不太可能很快修复。正如bug报告评论中指出的,问题的核心似乎是:

It's an OS limitation. A change to a file does not mean the directory is modified.

唯一真正的解决方法是将QFileSystemWatcher附加到每个文件上,这显然可以是prohibitively expensive(无论如何,在某些平台上)。在

除了这个问题之外,QFileSystemModel类目前还没有提供用于强制刷新的API,而且,正如您所发现的,似乎没有任何可靠的解决方法。在SO和其他地方提供的大多数“解决方案”都提出了一些变体:

root = fsmodel.rootPath()
fsmodel.setRootPath('')
fsmodel.setRootPath(root)

但正如您所知,这似乎只起一次作用-可能是由于当前实现文件信息缓存的方式有些古怪。在

目前看来,强制更新的唯一方法是替换整个模型。通过重构您的init_model方法,可以防止当前实现产生的错误消息,如下所示:

^{pr2}$

这是一个非常令人不满意的情况,但目前似乎没有任何明显的办法来解决它。在

相关问题 更多 >