Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QFileSystemWatcher在控制台应用程序中不发出fileChanged()_C++_Qt_Console_Qfilesystemwatcher - Fatal编程技术网

C++ QFileSystemWatcher在控制台应用程序中不发出fileChanged()

C++ QFileSystemWatcher在控制台应用程序中不发出fileChanged(),c++,qt,console,qfilesystemwatcher,C++,Qt,Console,Qfilesystemwatcher,在我的文件控制台.h/.cpp中,我有一个小类,它只要求用户键入一些文本,然后再次打印文本,直到用户输入“退出”(请参见方法consoleMain())。然而,在main.cpp中,我还有一个 QFileSystemWatcher它监视文件MyTextFile.txt,并在文本文件更改时调用控制台::slotFileChanged(QString)。不幸的是,QFileSystemWatcher无法工作控制台::slotFileChanged(QString)在我更改文本文件时从不执行。据我所知

在我的文件控制台.h/.cpp中,我有一个小类,它只要求用户键入一些文本,然后再次打印文本,直到用户输入“退出”(请参见方法
consoleMain()
)。然而,在main.cpp中,我还有一个
QFileSystemWatcher
它监视文件MyTextFile.txt,并在文本文件更改时调用
控制台::slotFileChanged(QString)
。不幸的是,
QFileSystemWatcher
无法工作<代码>控制台::slotFileChanged(QString)在我更改文本文件时从不执行。据我所知,
QFileSystemWatcher
仅在主事件循环已启动时工作,我的代码也是如此。 当我禁用main.cpp中的
QTimer::singlaShot
并将其替换为
emit console.signalStart()
主事件循环将不会被输入,但我在输入“退出”后会看到
QFileSystemWatcher
(“文件已更改!”)的消息。 问题是:当文本文件并行更改时,是否可以让用户与控制台交互并让FileWatcher发出信号? (我还尝试将
QFileSystemWatcher
放入控制台类并在堆上创建它;不幸的是,它没有改变任何东西)

这是我的密码:

控制台.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
#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
\ifndef控制台\u H
#定义控制台
#包括
#包括
#包括
类控制台:公共QObject
{
Q_对象
公众:
控制台(QObject*parent=0);
~Console();
信号:
void signalStart();
void signalEnd();
公众时段:
void consoleMain();
void slotFileChanged(QString文本);
void slotEmit();
};
#endif//CONSOLE\u 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();
}
#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();
}
#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);
}
#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”
控制台::控制台(QObject*父级):QObject(父级)
{
}
控制台::~Console()
{
}
void控制台::控制台main()
{
bool isRunning=true;
std::字符串输入;
同时(正在运行)
{

好的,问题解决了。我用不同的线程尝试了雅克的想法(感谢雅克的想法)。我必须引入一个名为
MyObject
QObject
的新子类。在其构造函数中,我为Console对象创建了
Console
和一个新的
QThread
。在main.cpp中创建了
QFileSystemWatcher
。请参见下面的代码:

myobject.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
#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
main.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();
}
#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();
}
#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);
}
#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();
}
#包括“myobject.h”
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
QFileSystemWatcher*watcher=新的QFileSystemWatcher(&a);
watcher->addPath(“C:/MyTextFile.txt”);
MyObject*object=新的MyObject(&a);
QObject::connect(监视程序、信号(fileChanged(QString))、对象、插槽(slotFileChanged(QString));

std::你能显式地调用
控制台main
吗?直到它完成运行,它才会运行。据我所知,Qt几乎没有控制台支持。解决这个问题的最简单方法可能是让控制台上有一个线程,主事件循环在另一个线程上运行,并让控制台发送消息与ma通信在事件循环中,谷歌找到的答案似乎传递了通过消息键入的字符,而这些字符必须手动重新组合。