我在QFilesystemModel
中使用QTreeView
。每当我删除由基础shutils.rmtree()
观看的文件夹(例如通过QFilesystemWatcher
)时,我都会收到此警告
QInotifyFileSystemWatcherEngine::addPaths: inotify_add_watch failed: Datei oder Verzeichnis nicht gefunden
QFileSystemWatcher: failed to add paths: /path/to/deleted/folder
在我看来,这应该通过从QFileSystemWatcher
删除文件夹,然后再使用QFileSystemWatcher.removePath()
删除它来解决。但这不适用于QFileSystemWatcher
QFileSystemModel
与QFileSystemModel
QFileSystemModel.remove()
(我搜索没有运气的解决方案)。
那么我可以告诉.rmdir()
停止观看文件夹吗?
PS:我知道我可以使用QFileSystemModel
或makeFromStoryboard
自动处理此问题。但这对我来说不是一个选择。我需要从UIViewController
。
我在Linux上使用Qt4和Python3。
答案 0 :(得分:1)
首先, QFileSystemModel
和QFileSystemWatcher
是两个不同的类。它们与以往任何方式都无关。 QFileSystemModel
不进行观看,您应该自己添加文件监视器。
顺便说一句,确实 QFileSystemModel::remove
只是删除了文件。你仍然会收到错误。
QFileSystemWatcher
隐藏在QFileSystemModel
代码的深处,这就是您无法访问它的原因。
但是,有一种简单的方法可以避免警告。这是一段代码片段。我们假设有一个名为/ tmp / trial的文件夹,其中包含一些文件。这是正在查看的文件夹,并在外部删除。
### == Code that creates a warning == ###
# Initial state
fsm = QFileSystemModel()
lv = QListView()
lv.setRootIndex( fsm.setRootPath( "/tmp/trial" ) )
# External deletion of "/tmp/trial", leads to this error
shutils.rmtree( "/tmp/trial" )
# Error
QInotifyFileSystemWatcherEngine::addPaths: inotify_add_watch failed: file or directory not found
QFileSystemWatcher: failed to add paths: /tmp/trial
### == Suggested edit == ###
# Initial state
fsm = QFileSystemModel()
lv = QListView()
lv.setRootIndex( fsm.setRootPath( "/tmp/trial" ) )
# Just before deleting
lv.setRootIndex( fsm.setRootPath( "/tmp" ) )
# External deletion of "/tmp/trial", gives no error
# This even look very neat for the user.
shutils.rmtree( "/tmp/trial" )
为了简单起见,我跳过了代理模型并使用了列表视图,但在您的情况下,代理模型和树视图的过程是相同的。