在我的文件中console.h/.cpp我有一個小類,它只是要求用戶鍵入一些文本,然後再打印文本,直到用戶輸入「退出」(參見方法consoleMain()
)。但是,在main.cpp我也有一個 QFileSystemWatcher
它觀看文件MyTextFile.txt並且每當文本文件更改時調用Console::slotFileChanged(QString)
。不幸的是,QFileSystemWatcher
不起作用。當我更改文本文件時,從未執行Console::slotFileChanged(QString)
。據我所知,QFileSystemWatcher
只適用於主事件循環已經開始,這也是我的代碼中的情況。 當我在main.cpp中禁用QTimer::singlaShot
和emit console.signalStart()
主事件循環替換它不會進入,但我看到的消息QFileSystemWatcher
(「文件改變了!」)後,我進入「跳槽」。 問題是:是否可以讓用戶與控制檯進行交互,並在文本文件並行更改時讓FileWatcher發出信號? (我也嘗試把QFileSystemWatcher
到控制檯類堆上創建它,遺憾的是它並沒有改變任何東西)QFileSystemWatcher不會在控制檯應用程序中發出fileChanged()
這裏是我的代碼:
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();
}
顯式調用'consoleMain'。直到它完成運行,它運行。據我所知,Qt幾乎沒有控制檯支持。解決它的最簡單方法可能是在控制檯上放置一個線程,並在主線事件循環中運行不同線程,並讓控制檯發送消息與主事件循環進行通信?谷歌發現http://stackoverflow.com/a/18889631/1774667答案似乎通過郵件傳遞鍵入的字符,你必須重新手動。 – Yakk