我正在尝试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

08-24 17:47