c++ - Qt5跨线程信号和槽
问题描述
在此问题因重复而关闭之前:关于同一问题的问题是从 2009 年开始的,Qt 改变了应该如何实现线程。
我的 Qt 应用程序有一个主线程和一个工作线程。我简化了问题的代码,但问题如下:
如果 MainWindow 对象发出一个信号,则该信号必须由另一个 QThread 中的工作对象的插槽接收。
主要功能如下:
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::process
确实是阻塞了事件循环。
推荐阅读
- firebase - 使用 Firebase 部署时出错:getaddrinfo ENOTFOUND
- c - 函数 struct page* alloc_pages() 中的无符号整数顺序是什么
- vue.js - 从数据库中获取数据,将其存储在数组中,以在 vuejs 中绘制图表
- java - 使用 BroadcastReceiver 更新 ProgressBar
- c++ - WS_EX_LAYOUTRTL、WS_EX_RTLREADING 和 WS_EX_RIGHT 有什么区别?
- javascript - 如何修复调色板中组内成员元素的“位置”属性的绑定?
- node.js - 我从 .env 文件中获取过时的数据
- cron - 使用 Cron 选项卡在 Web 浏览器上打开 localhost
- python-3.x - 在 Docker 文件中设置 mysql-connector-python
- reactjs - 在 React Redux 中联合调用多个操作