【问题标题】:QFileSystemWatcher working only in main()QFileSystemWatcher 仅在 main() 中工作
【发布时间】:2015-02-12 01:37:23
【问题描述】:

我正在尝试使用 QFileSystemWatcher,如下例所示: How to use QFileSystemWatcher to monitor a folder for change 我的问题是,当我在 main() 函数中创建它时,观察者确实可以工作,如下所示:

#include "mainwindow.h"
#include <QApplication>

#include <QFileSystemWatcher>
#include <QDebug>
#include "systemfilewatcher.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFileSystemWatcher watcher;
    watcher.addPath("C:/QtTest");
    SystemFileWatcher* mc = new SystemFileWatcher();
    QObject::connect(&watcher, SIGNAL(directoryChanged(QString)), mc, 
                     SLOT(showModified(QString)));
    MainWindow w(&watcher);
    w.show();
    return a.exec();
}

但是,当我在我的 ui 中尝试使用完全相同的代码时,如下所示,它不起作用:

MainWindow::MainWindow(QFileSystemWatcher folder, QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
 {
    ui->setupUi(this);

    QFileSystemWatcher watcher;
    watcher.addPath("C:/QtTest");
    SystemFileWatcher* mc = new SystemFileWatcher();
    QObject::connect(&watcher, SIGNAL(directoryChanged(QString)), mc, SLOT(showModified(QString)));

这是我的“systemfilewatcher.h”:

#ifndef SYSTEMFILEWATCHER
#define SYSTEMFILEWATCHER
#include <QWidget>
#include <QMessageBox>

class SystemFileWatcher : public QWidget
{
    Q_OBJECT

public:
    SystemFileWatcher(QWidget* parent=0)
        :QWidget(parent){}

    ~SystemFileWatcher(){}

public slots:
    void showModified(const QString& str)
    {
        QMessageBox::information(this,"Directory Modified", str);
    }
};
#endif // SYSTEMFILEWATCHER

     }

我的目标是检测何时在目标目录中创建文件并将其名称放入 QString 堆栈中。我不知道我在这里做错了什么,有人可以帮助我吗?

【问题讨论】:

  • 由于对 C++ 中对象生命周期的误解,这个问题相当于一个小错误。该问题和 Qt 的特定组合对其他人没有用,因此我投票关闭 - 在 SO 上有太多相同问题的化身。

标签: c++ qt qfilesystemwatcher


【解决方案1】:

在第二种情况下,您的QFileSystemWatcher watcher 在堆栈上创建,并在构造函数结束后立即销毁。您必须在某处保留对它的引用,可能作为SystemFileWatcher 类的属性

【讨论】:

  • 通过更改这一行解决了我的问题:QFileSystemWatcher watcher();通过这个:QFileSystemWatcher *watcher = new QFileSystemWatcher();感谢您的帮助。
  • 当心,如果不维护对对象的引用,您将无法销毁它,您会遇到内存泄漏
  • @Smasho 不在 Qt 中,如果实例是 QObject 派生的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2014-12-11
  • 2013-10-25
  • 2018-11-27
  • 1970-01-01
  • 2012-09-27
相关资源
最近更新 更多