【已解决】Qt发送信号后,槽函数没有响应
Qt发送信号后,槽函数没有响应
- 检查有没有连接正确的信号和槽函数,有时候,大意了,会写错
- 检查
connect
函数返回值,有没有连接成功 - 检查对象的创建方式,确保在信号发送前,以及槽函数接收前,发送和接收信号的对象有没有被析构。主要出现在,对象直接定义在函数内部的情况
- 检查有没有跨线程。如果是这样的话,你可以设置一下connect的第五个参数。如果接收者和发送者不在一个线程,第五个参数即连接类型自动使用
Qt::QueuedConnection
类型,而该类型存在的问题是,只有当控制权在槽函数所在线程的时间循环时,才会被调用,而不能保证实时性,即不能保证只要信号一触发,槽函数马上就能响应。为解决此问题,可以采用Qt::BlockingQueuedConnection
类型进行连接,该连接类型使得发送完信号后发送者所在线程会被阻塞,直到槽函数运行完,保证了槽函数响应的实时性。但是需要注意这种方式必须要保证信号和槽不在同一个线程,否则程序会死锁。
解决
在检查完代码后,排除了前3条,只剩下了第4条。
我得信号确实是在新的线程中发送的。改用Qt::BlockingQueuedConnection
模式绑定信号和槽。问题解决!
CreateTemplDialog dlg(templPtr, this);
connect(
&dlg,
&OiCreateTemplDialog::sigTemplEdited,
d->_listModel,
&OiTemplateListModel::onEditTempl,
Qt::BlockingQueuedConnection);
connect(
&dlg,
&OiCreateTemplDialog::sigTemplEdited,
d->_tableModel,
&OiTemplateTableModel::onEditTempl,
Qt::BlockingQueuedConnection);
dlg.exec();