2

私のファイル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();
}
4

1 に答える 1