QFile系统模型不发出文件重命名的信号



我试图使用QFileSystemModel来观察目录中的变化。每当我重命名根路径中的文件时,只会发出directoryLoaded()信号。我希望发出fileRenamed()信号,以便我知道哪个文件被重命名为新名称。下面是我的代码:

model = new QFileSystemModel;
model->setRootPath("C:/test/");
QObject::connect(model, SIGNAL(fileRenamed(const QString&, const QString&, const QString&)), this, SLOT(updateRename()));
QObject::connect(model, SIGNAL(directoryLoaded(const QString&)), this, SLOT(loadDir()));

恐怕你对这个QFileSystemModel班期望太高了。如果重命名操作发生在模型之外,它不会也无法捕获。我查了fileRenamed()信号的所有用途,似乎它发出的唯一地方是在这里:https://code.woboq.org/qt5/qtbase/src/widgets/dialogs/qfilesystemmodel.cpp.html#933

如果你看上面几行,你可以看到,当重命名发生在这个函数https://code.woboq.org/qt5/qtbase/src/widgets/dialogs/qfilesystemmodel.cpp.html#873内时,这是触发的。换句话说,如果你使用QFileSystemModel::setData()来设置一个项目的名称,它将重命名项目并发出信号。这是唯一能发出信号的方法。

这是合乎逻辑的,如果重命名发生在程序之外,那么没有特定的方法可以发现某个文件被重命名了。您的应用程序只观察到一些文件消失,而另一个具有不同名称的文件出现。当然,你可以检查文件的时间戳和大小是否相同,它们是否也在同一个父文件夹中,也许还可以检查文件内容…只有当这些内容匹配并且唯一的区别是文件名时,您才能得出结论,该文件已重命名。但这是你必须自己编程的东西。QFileSystemModel不会为你做这件事,因为它不知道你的具体意图。

最新更新