QFileSystemModel从Watcher中删除文件夹

时间:2016-03-26 20:23:40

标签: qt

我在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 QFileSystemModelQFileSystemModel QFileSystemModel.remove()(我搜索没有运气的解决方案)。

那么我可以告诉.rmdir()停止观看文件夹吗?

PS:我知道我可以使用QFileSystemModelmakeFromStoryboard自动处理此问题。但这对我来说不是一个选择。我需要从UIViewController

之外删除该文件夹

我在Linux上使用Qt4和Python3。

1 个答案:

答案 0 :(得分:1)

首先,QFileSystemModelQFileSystemWatcher是两个不同的类。它们与以往任何方式都无关。 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" )

为了简单起见,我跳过了代理模型并使用了列表视图,但在您的情况下,代理模型和树视图的过程是相同的。