Qt中QRunnable的信号未被接收/未连接。

3
我正在用C++编写一个Qt应用程序。我有一个在QThreadPool中运行的QRunnable,并向主线程发送信号。问题是连接不起作用:即使我已经验证了发出发射信号的代码确实被调用,但主线程从未接收到该信号。以下是我的代码:
我的QRunnable类:
class OfflineAnalysisThread : public QObject, public QRunnable
{
Q_OBJECT

public:
void run();
void sendMessage(QString &qmsg)
{
    emit threadMessageCallback(qmsg);
}

signals:
void threadMessageCallback(QString &string);
};

调用类(主线程):
class OfflineAnalysisMain : public QObject
{
Q_OBJECT

public:

    (...)

public slots:
void threadMsg(QString &string);
};

实例化新的QRunnable并启动它们的代码:
void OfflineAnalysisMain::myFunction()
{
    OfflineAnalysisThread *newTask = new OfflineAnalysisThread();

    QObject::connect(newTask, SIGNAL(threadMessageCallback(QString &)), this, SLOT(threadMsg(QString &)));

    QThreadPool::globalInstance()->start(newTask);
}

所以,从我的QRunnable的run函数中,我调用sendMessage,然后执行QApplication::exec()。我在OfflineAnalysisMain.cpp文件中的threadMsg槽函数实现上设置了断点,但该函数从未被调用。
我做错了什么?
更新:
我的OfflineAnalysisThread::run()函数的定义:
void OfflineAnalysisThread::run()
{
    std::string myMsg("This is my message");
    sendMessage(myMsg);

    QApplication::exec();
}

我也尝试了不使用 QApplication::exec(),但没有成功。


展示一下你对 OfflineAnalysisThread::run() 的定义。从你写的内容来看,似乎不太对。你不应该在 run() 中调用 QApplication::exec() - RA.
我刚刚更新了我的帖子,并附上了run()的定义,请看一下。另外,我也尝试过不使用exec()(事实上那是我的原始代码,我添加了exec()来看看是否有效)。 - Karl Arsenault
1个回答

1

run()中删除对QApplication::exec()的调用。最好在main函数中调用。

为了使您的代码正常工作,我编写了以下main函数:

#include <QApplication>
#include <QMetaType>

#include <offlineanalysismain.h>

int main(int argc, char* argv[])
{
   QApplication app(argc, argv);

   qRegisterMetaType<QString>("QString&");

   OfflineAnalysisMain* main = new OfflineAnalysisMain;
   main->myFunction();

   return app.exec();
}

请注意调用qRegisterMetaType,它允许Qt通过信号槽连接跨线程边界传递QString

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接