我正在尝试QFileSystemWatcher
,但它不按预期工作。还是我做错了什么?
我将QFileSystemWatcher
设置为观看单个文件。当我第一次修改文件时,fileChanged()
被发出,没关系。但是,当我再次修改文件时,fileChanged()
不再发出。
这是源代码:
main.cpp
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
mainwindow.h
#include <QDebug>
#include <QFileSystemWatcher>
#include <QMainWindow>
#include <QString>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
private slots:
void directoryChanged(const QString & path);
void fileChanged(const QString & path);
private:
QFileSystemWatcher * watcher;
};
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow()
{
watcher = new QFileSystemWatcher(this);
connect(watcher, SIGNAL(fileChanged(const QString &)), this, SLOT(fileChanged(const QString &)));
connect(watcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(directoryChanged(const QString &)));
watcher->addPath("path to directory");
watcher->addPath("path to file");
}
void MainWindow::directoryChanged(const QString & path)
{
qDebug() << path;
}
void MainWindow::fileChanged(const QString & path)
{
qDebug() << path;
}
谢谢您的回答。
编辑1
我在Linux下运行了这段代码。
编辑2
我实际上需要检查某个目录给出的树中的所有MetaPost文件,是否已被修改。我可能会坚持使用我的替代解决方案,即每秒运行QTimer并手动检查所有文件。 QFileSystemWatcher可能在内部以类似方式执行此操作,但可能更有效。
最佳答案
刚才有同样的问题。似乎QFileSystemWatcher认为该文件被删除,即使仅对其进行了修改。至少在Linux文件系统上是如此。我的简单解决方案是:
if (QFile::exists(path)) {
watcher->addPath(path);
}
将以上内容添加到
fileChanged()
的处理程序中。根据需要更改单词watcher
。