QFileSystemModel 不发出 fileRenamed 信号

QFileSystemModel doesn't emit fileRenamed signal

我正在尝试使用 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()));

恐怕您对此期望过高QFileSystemModelclass。如果重命名操作发生在模型之外,它不会也无法捕获。我查看了 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不会为你做,因为它不知道你的具体意图。