Qt:插槽没有被第二个线程调用

Qt: slots are not being called from the second thread

我想从第二个线程更新 UI,我已经创建了将通过信号从其他线程调用的插槽,但不知何故它没有从其他线程调用。下面是代码:

WorkerThread.h

class WorkerThread: public QObject
{
    Q_OBJECT
public:
    WorkerThread();
    ~WorkerThread();

public slots:
    void onStart();
signals:
    void sendMessage(const QString& msg, const int& code);
};

WorkerThread.cpp

#include "workerwhread.h"

WorkerThread::WorkerThread(){}

void WorkerThread::onStart(){
    emit sendMessage("start", 100);
}

用法:

MyWidget.h

namespace Ui {
class MyWidget;
}

class MyWidget: public QWidget
{
    Q_OBJECT

public:
    explicit MyWidget(QWidget *parent = 0);
    ~MyWidget();
private slots:
    void onGetMessage(const QString &msg, const int& code);
private:
    Ui::MyWidget *ui;
    QThread *thread = nullptr;
    WorkerThread *wt = nullptr;
};

MyWidget.cpp

MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    wt = new WorkerThread;
    thread = new QThread;

    connect(thread, &QThread::finished, wt, &QObject::deleteLater);
    connect(ui->btStart, &QPushButton::clicked, wt, &WorkerThread::onStart);
    connect(wt, &WorkerThread::sendMessage, this, &MyWidget::onGetMessage);
    wt->moveToThread(thread);
    thread->start();
}
void MyWidget::onGetMessage(const QString &msg, const int& code)
{
    qDebug() << "message" << msg; // this never being called ????
}

注意:当我传递连接类型Qt::DirectConnectoin时,它是有效的,但问题是它不是GUI线程。

connect(wt, &WorkerThread::sendMessage, this, &MyWidget::onGetMessage, Qt::DirectConnection);

主要

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    w.setWindowIcon(QIcon(":/icons/system.png"));
    return a.exec();
}

经过大量的尝试和逐行检查代码,我终于找到了问题所在。原因是覆盖 QWidgetevent() 函数,event() 函数的 return 值是 bool,所以如果你 return a true 没问题,运行良好,不会抛出任何运行时或 compile-time 错误。但它会阻止 signal-slot 事件的发生。

所以不是 return true,而是return QWidget::event(event);那么问题就解决了。