C ++ Qt 5.0.2 QFileSystemWatcher на Windows не видит изменений каталога

У меня проблема с QFileSystemWatcher из Qt 5.0.2 для Windows.

test.cpp

...
QFileSystemWatcher watcher;
watcher.addPath("C:/data/watch");

QStringList directoryList = watcher.directories();
Q_FOREACH(QString directory, directoryList)
qDebug() << "Directory name" << directory <<"\n";

DirectoryWatcher* dw = new DirectoryWatcher;

QObject::connect(
&watcher, SIGNAL(directoryChanged(const QString&)),
dw,       SLOT(showModified(const QString&))
);

QObject::connect(
&watcher, SIGNAL(fileChanged(QString)),
dw,       SLOT(showChanged(QString))
);

DirectoryWatcher.cpp

DirectoryWatcher::DirectoryWatcher(QWidget* parent) : QWidget(parent)
{
qDebug() << "monitoring" << endl;
}

void DirectoryWatcher::showModified(const QString& str) {
qDebug() << "Sending File" << str << endl;
}

void DirectoryWatcher::showChanged(const QString& str) {
qDebug() << "show changed " << str << endl;
}

Проблема, с которой я сталкиваюсь, заключается в том, что даже когда я создаю / перемещаю / редактирую файл в папку «C: / data / watch», функции «showModified» или «showChanged» не будут вызываться, даже если у них есть

Я уверен, что имена слотов правильные, потому что, если я изменяю имена слотов, которые идут в качестве параметров, на несуществующие, я получаю сообщение об ошибке:

QObject::connect: No such slot DirectoryWatcher::showChangeds(QString) (kernel\qobject.cpp:2082, void err_method_notfound(const QObject*, const char*, const char*))

Я также уверен, что каталог, который я добавляю в качестве пути, существует, потому что при выполнении листинга:

QStringList directoryList = watcher.directories();
Q_FOREACH(QString directory, directoryList)
qDebug() << "Directory name" << directory <<"\n";

Я получаю свой каталог:

Directory name "C:/data/watch"

и документация четко гласит: (http://qt-project.org/doc/qt-5.0/qtcore/qfilesystemwatcher.html#addPath)

Adds path to the file system watcher if path exists. The path is not added if it does not exist, or if it is already being monitored by the file system watcher.

Ясно, что я что-то упустил.
Было бы очень признательно, если бы кто-то мог указать, где моя ошибка, или, возможно, даже дать другое решение для решения моей проблемы.

Ваша помощь будет принята с благодарностью. Спасибо.

0

Решение

Вы, кажется, размещаете свой объект QFileSystemWatcher в памяти стека, поэтому после завершения функции, в которой вы создаете объект, ваш объект будет уничтожен. Так что используйте это вместо:

QFileSystemWatcher *watcher = new QFileSystemWatcher();
2

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

Других решений пока нет …

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