Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QFileSystemWatcher仅在main()中工作_C++_Qt_Qfilesystemwatcher - Fatal编程技术网

C++ QFileSystemWatcher仅在main()中工作

C++ QFileSystemWatcher仅在main()中工作,c++,qt,qfilesystemwatcher,C++,Qt,Qfilesystemwatcher,我尝试使用QFileSystemWatcher,如下例所示: 我的问题是,当我在main()函数中创建观察程序时,它确实可以工作,如下所示: #include "mainwindow.h" #include <QApplication> #include <QFileSystemWatcher> #include <QDebug> #include "systemfilewatcher.h" int main(int argc, char *argv[])

我尝试使用QFileSystemWatcher,如下例所示: 我的问题是,当我在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();
}
这是我的“systemfilewatcher.h”:

#ifndef SYSTEMFILEWATCHER
#定义SYSTEMFILEWATCHER
#包括
#包括
类SystemFileWatcher:公共QWidget
{
Q_对象
公众:
SystemFileWatcher(QWidget*parent=0)
:QWidget(父项){}
~SystemFileWatcher(){}
公众时段:
void showModified(常量QString和str)
{
QMessageBox::信息(此“目录已修改”,str);
}
};
#endif//SYSTEMFILEWATCHER
}

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

在第二种情况下,您的
QFileSystemWatcher观察器将在堆栈上创建,并在构造函数结束后立即销毁。您必须在某个地方保留对它的引用,可能是您的
SystemFileWatcher
类的一个属性

通过更改此行解决了我的问题:QFileSystemWatcher watcher();通过这个:QFileSystemWatcher*watcher=newQFileSystemWatcher();谢谢你的帮助。注意,如果不保留对该对象的引用,你将无法销毁它,你将获得一个内存leak@Smasho不是在QT中,如果实例是QObjt派生的,那么这个问题就等于由于C++中对象生命周期的误解而导致的一个简单错误。这个问题和Qt的特殊组合对其他人没有用处,因此我投票决定结束——同样的问题有太多的化身。
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)));
#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

     }