gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:39 25 4
gpt4 key购买 nike

在我的文件 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 放入控制台类并在堆上创建它;不幸的是它没有改变任何东西)

这是我的代码:

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();
}

最佳答案

好的,解决了。我已经使用不同的线程尝试了 Yakk 的想法(感谢 Yakk 的想法)。我不得不引入一个名为 MyObjectQObject 的新子类。在其构造函数中,我为控制台对象创建了 Console 和一个新的 QThreadQFileSystemWatcher 是在 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).

关于c++ - QFileSystemWatcher 不在控制台应用程序中发出 fileChanged(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29807758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com