<p><strong>更新</strong>:</p>
<p>从Qt-5.9.4开始,<code>QT_FILESYSTEMMODEL_WATCH_FILES</code>环境变量可用于打开每个文件监视(请参见<a href="https://bugreports.qt.io/browse/QTBUG-46684" rel="nofollow noreferrer">QTBUG-46684</a>)。在模型开始缓存有关文件的信息之前,需要将该值设置为非空值。但请注意,这将为遇到的每个文件添加一个文件监视程序,因此这可能使其成为<a href="https://doc.qt.io/qt-5/qfilesystemwatcher.html#details" rel="nofollow noreferrer">expensive solution on some systems</a>。在</p>
<p>原始答案留在下面作为对问题的解释。在</p>
<hr/>
<p>此问题是由长期存在的Qt错误引起的:<a href="https://bugreports.qt.io/browse/QTBUG-2276" rel="nofollow noreferrer">QTBUG-2276</a>。不幸的是,目前看来不太可能很快修复。正如bug报告评论中指出的,问题的核心似乎是:</p>
<blockquote>
<p>It's an OS limitation. A change to a file does not mean the directory
is modified.</p>
</blockquote>
<p>唯一真正的解决方法是将<code>QFileSystemWatcher</code>附加到<em>每个文件</em>上,这显然可以是<a href="https://doc.qt.io/qt-5/qfilesystemwatcher.html#details" rel="nofollow noreferrer">prohibitively expensive</a>(无论如何,在某些平台上)。在</p>
<p>除了这个问题之外,<a href="https://doc.qt.io/qt-5/qfilesystemmodel.html" rel="nofollow noreferrer">QFileSystemModel</a>类目前还没有提供用于强制刷新的API,而且,正如您所发现的,似乎没有任何可靠的解决方法。在SO和其他地方提供的大多数“解决方案”都提出了一些变体:</p>
<pre><code>root = fsmodel.rootPath()
fsmodel.setRootPath('')
fsmodel.setRootPath(root)
</code></pre>
<p>但正如您所知,这似乎只起一次作用-可能是由于当前实现文件信息缓存的方式有些古怪。在</p>
<p>目前看来,强制更新的唯一方法是替换<em>整个模型</em>。通过重构您的<code>init_model</code>方法,可以防止当前实现产生的错误消息,如下所示:</p>
^{pr2}$
<p>这是一个非常令人不满意的情况,但目前似乎没有任何明显的办法来解决它。在</p>