QFileSystemWatcher работает только в main ()

Я пытаюсь использовать QFileSystemWatcher, как в следующем примере:
Как использовать 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();
}

Однако, когда я пытаюсь точно такой же код в моем пользовательском интерфейсе, как показано ниже, он не работает:

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. Я не знаю, что я делаю не так, может кто-нибудь помочь мне, пожалуйста?

-1

Решение

Во втором случае ваш QFileSystemWatcher watcher создается в стеке и уничтожается, как только заканчивается конструктор. Вы должны хранить ссылку на него где-то, возможно, как атрибут вашего SystemFileWatcher учебный класс

1

Другие решения


По вопросам рекламы [email protected]