Qt QFileSystemWatcher:信号fileChanged()仅发出一次

piz*_*zet 10 c++ qt

我正在尝试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();
}
Run Code Online (Sandbox Code Playgroud)

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;
};
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢您的回答.

编辑1

我在Linux下运行此代码.

编辑2

我实际上需要检查某个目录给出的树中的所有MetaPost文件,无论它们是否被修改.我可能会坚持我的替代解决方案,即每秒运行QTimer并手动检查所有文件.QFileSystemWatcher可能在内部以类似的方式执行此操作,但可能更有效.

Pet*_*ter 14

刚才有同样的问题.好像QFileSystemWatcher认为即使文件被修改也会被删除.至少在Linux文件系统上.我的简单解决方案是:

if (QFile::exists(path)) {
    watcher->addPath(path);
}
Run Code Online (Sandbox Code Playgroud)

将以上内容添加到您的处理程序中fileChanged().watcher根据需要更改单词.

[编辑]删除了QFile :: exists(),它是用addPath()处理的.


Rob*_*bin 13

我在Linux上使用Qt5时遇到了同样的问题.找出原因:

某些文本编辑器(如kate)不会修改文件的内容,而是用新文件替换原始文件.替换文件将删除旧文件(IN_DELETE_SELF事件),因此qt将停止观看文件.

解决方案是还要查看文件的目录以获取创建事件.


小智 5

我可以确认您当前的 Qt5 和 Linux 的问题。除了 Peter 给出的答案之外,我还通过将以下代码添加到槽函数的末尾来解决这个问题:

QFileInfo checkFile(path);
while(!checkFile.exists())
    std::this_thread::sleep_for(std::chrono::milliseconds(10));
watcher->addPath(path);
Run Code Online (Sandbox Code Playgroud)

请注意,如果您立即添加路径,该文件通常还不存在,您会收到警告,并且根本不会添加任何内容,并且观察者会丢失该路径。因此,您必须等待/睡眠,直到文件再次恢复活力,然后添加它。

另请注意,在本示例中,我使用 C++11 并包含 和 来实现睡眠。