【已解决】Qt发送信号后,槽函数没有响应

Qt发送信号后,槽函数没有响应

  1. 检查有没有连接正确的信号和槽函数,有时候,大意了,会写错
  2. 检查connect函数返回值,有没有连接成功
  3. 检查对象的创建方式,确保在信号发送前,以及槽函数接收前,发送和接收信号的对象有没有被析构。主要出现在,对象直接定义在函数内部的情况
  4. 检查有没有跨线程。如果是这样的话,你可以设置一下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();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值