QFileSystemWatcher не выдает fileChanged () в консольном приложении

в моих файлах console.h / .cpp у меня есть небольшой класс, который просто просит пользователя ввести текст, а затем просто печатает текст снова, пока пользователь не введет «выход» (см. метод consoleMain()). Однако в main.cpp у меня тоже есть
QFileSystemWatcher который смотрит файл MyTextFile.txt и звонки Console::slotFileChanged(QString) всякий раз, когда текстовый файл изменяется. К сожалению QFileSystemWatcher не работает. Console::slotFileChanged(QString) никогда не выполняется, когда я изменяю текстовый файл. Насколько я знаю, QFileSystemWatcher работает только если основной цикл событий был запущен, и это также имеет место в моем коде.
Когда я отключаю QTimer::singlaShot в main.cpp и заменить его на emit console.signalStart()
основной цикл событий не будет введен, но я вижу сообщение QFileSystemWatcher («Файл изменен!») после того, как я ввожу «выйти».
Вопрос заключается в следующем: возможно ли позволить пользователю взаимодействовать с консолью и позволить FileWatcher генерировать сигнал при параллельном изменении текстового файла?
(Я также пытался поставить QFileSystemWatcher в консольный класс и создание его в куче; к сожалению это ничего не изменило)

Вот мой код:

console.h

#ifndef CONSOLE_H
#define CONSOLE_H

#include <iostream>
#include <QObject>
#include <QFileSystemWatcher>

class Console: public QObject
{
Q_OBJECT

public:

Console(QObject *parent = 0);
~Console();

signals:

void signalStart();
void signalEnd();

public slots:

void consoleMain();
void slotFileChanged(QString text);
void slotEmit();
};

#endif // CONSOLE_H

console.cpp

#include "console.h"
Console::Console(QObject *parent): QObject(parent)
{
}

Console::~Console()
{
}

void Console::consoleMain()
{
bool isRunning = true;
std::string in;

while (isRunning)
{
std::cout << ">" << std::flush;
std::getline(std::cin, in);

if (in.compare("quit") == 0)
isRunning = false;
else
std::cout << "You have entered: " << in << std::endl;
}

emit signalEnd();
}

void Console::slotFileChanged(QString text)
{
Q_UNUSED(text);
std::cout << "File changed!" << std::endl;
}

void Console::slotEmit()
{
emit signalStart();
}

main.cpp

#include "console.h"#include <QCoreApplication>
#include <QTimer>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QFileSystemWatcher watcher(&a);
watcher.addPath("C:/MyTextFile.txt");

Console console(&a);

QObject::connect(&console, SIGNAL(signalStart()), &console, SLOT(consoleMain()));
QObject::connect(&console, SIGNAL(signalEnd()), &a, SLOT(quit()));
QObject::connect(&watcher, SIGNAL(fileChanged(QString)), &console, SLOT(slotFileChanged(QString)));

QTimer::singleShot(0, &console, SLOT(slotEmit()));
//emit console.signalStart();

std::cout << "Enter main event loop now" << std::endl;
return a.exec();
}

2

Решение

Хорошо, это решено. Я попробовал идею Якка, используя разные темы (спасибо за идею Якка). Я должен был представить новый подкласс QObject называется MyObject, В своем конструкторе я создаю Console и новый QThread для объекта консоли. QFileSystemWatcher создан в main.cpp а также пример MyObjcet, Смотрите код ниже:

myobject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include "console.h"#include <QThread>
#include <QCoreApplication>

class MyObject : public QObject
{
Q_OBJECT

public:

MyObject(QObject *parent = 0);
~MyObject();

private:

QThread *thread;
Console *console;

signals:

void signalStart();

public slots:

void slotFileChanged(QString text);
void slotEnd();
};

#endif // MYOBJECT_H

myobject.cpp

#include "myobject.h"
MyObject::MyObject(QObject *parent): QObject(parent)
{
console = new Console;

thread = new QThread(this);
console->moveToThread(thread);
thread->start();

connect(this, SIGNAL(signalStart()), console, SLOT(consoleMain()));
connect(console, SIGNAL(signalEnd()), this, SLOT(slotEnd()));
emit signalStart();
}

MyObject::~MyObject()
{
thread->quit();
thread->wait();
}

void MyObject::slotFileChanged(QString text)
{
console->displayChangedFileText(text);
}

void MyObject::slotEnd()
{
QCoreApplication::exit(0);
}

main.cpp

#include "myobject.h"#include <QTimer>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QFileSystemWatcher *watcher = new QFileSystemWatcher(&a);
watcher->addPath("C:/MyTextFile.txt");

MyObject *object = new MyObject(&a);

QObject::connect(watcher, SIGNAL(fileChanged(QString)), object, SLOT(slotFileChanged(QString)));

std::cout << "Enter main event loop now" << std::endl;
return a.exec();
}

console.h / .cpp неграмотны, только Console::slotFileChanged(QString) был заменен Console::displayChangedFileText(QString),

1

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


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