来自QRunnable的Qt信号未接收/未连接

时间:2013-03-02 19:27:35

标签: qt signals slot

我正在用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();但没有成功。

1 个答案:

答案 0 :(得分:1)

QApplication::exec()内删除对run()的来电。理想情况下,您可以在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