Qt5跨线程信号和槽

Posted

技术标签:

【中文标题】Qt5跨线程信号和槽【英文标题】:Qt5 cross-threads signal and slot 【发布时间】:2018-06-27 22:06:27 【问题描述】:

在此问题因重复而关闭之前:关于同一问题的问题是从 2009 年开始的,Qt 改变了应该如何实现线程。

我的 Qt 应用程序有一个主线程和一个工作线程。我简化了问题的代码,但问题如下:

如果 MainWindow 对象发出一个信号,则该信号必须由另一个 QThread 中的 worker 对象的槽接收。

主要功能如下:

int main(int argc, char *argv[])

    QApplication a(argc, argv); 
    MainWindow w(0, [lot of irrelevant argumtents], ...)

    QThread* thread = new QThread;
    Worker *worker = new Worker(&w);
    QObject::connect(&w, SIGNAL(demoButtonClicked()), worker, SLOT(DemoButton()));
    QObject::connect(thread, SIGNAL(started()), worker, SLOT(process()));
    worker->moveToThread(thread);
    thread->start();

    w.show();
    a.exec();

(简化的)工人类如下所示:

class Worker : public QObject

    Q_OBJECT
public:
    Worker(MainWindow *w);
public slots:
    void process();
    void DemoButton();
;


void Worker::DemoButton()
    cout << "Slot for demo button executed from worker thread!" << endl;

主窗口类包含这个函数和头文件中定义的信号:

void MainWindow::on_pushButton_3_clicked()

    std::cout << "Signal for demo button emitted!" << std::endl;
    emit demoButtonClicked();

当我执行程序时,on_pushButton_3_clicked 函数被执行,但没有执行worker对象中的槽。

【问题讨论】:

你能在 MainWindow.h 中显示信号吗? 我已经尝试了显示并正常工作的逻辑,可能错误在其他地方。 请展示Worker::process的实现。你确定它没有阻塞事件循环吗? @G.M.谢谢,确实是这个问题。 【参考方案1】:

发现问题,Worker::process 确实阻塞了事件循环。

【讨论】:

以上是关于Qt5跨线程信号和槽的主要内容,如果未能解决你的问题,请参考以下文章

Qt信号和槽对值传递参数和引用传递参数的总结

在 qt C++ 信号和槽中使用已删除函数错误

Qt4 中的信号和槽

Qt多线程程序设计中,可使用信号和槽进行线程通信

Qt 信号槽

Qt C++ 信号和槽没有触发