私のファイルconsole.h/.cppには、ユーザーにテキストを入力するように求める小さなクラスがあり、ユーザーが「quit」と入力するまでテキストを再度出力します(メソッドを参照consoleMain()
)。ただし、main.cppには
QFileSystemWatcher
、ファイルMyTextFile.txtConsole::slotFileChanged(QString)
を監視し、テキスト ファイルが変更されるたびに呼び出すもあります。残念ながら、QFileSystemWatcher
動作しません。Console::slotFileChanged(QString)
テキストファイルを変更しても実行されません。私の知る限りQFileSystemWatcher
、メインイベントループが開始された場合にのみ機能し、これは私のコードにも当てはまります。main.cppでを無効にQTimer::singlaShot
して mainに置き換えると、
イベント ループには入りませんが、("File changed!")のメッセージが表示されます。emit console.signalStart()
QFileSystemWatcher
「quit」と入力した後。問題は、ユーザーがコンソールを操作できるようにして、テキスト ファイルが同時に変更されたときに 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
コンソール.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();
}