啥名字都不好听 2022-12-08 11:13 采纳率: 0%
浏览 69

Qt 运行多态时,槽函数不被触发

问题遇到的现象和发生背景

我的程序需要支持不同的设备,所以用了运行多态的方法,3个类都继承一个基类,通过运行时确定运行哪一个类

遇到的现象和发生背景,请写出第一个错误信息

发现主线程发信号触发子线程的槽函数可以执行 , 但是子线程的信号无法触发主线程的槽函数;

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%

if (device_name == "PeakCan"){
canRecv = new CPeakCan;
qDebug() << "device is PeakCan";
}
else if (device_name == "ZlgCan"){
canRecv = new CCanFdRecver;
qDebug() << "device is ZlgCan";
}
else if (device_name == "VectorCan"){
canRecv = new VectorCan;
qDebug() << "device is VectorCan";
}

pthread = new QThread(this);

connect(this,&DeviceWidget::start_work,canRecv,&CanBase::work_thread);
connect(canRecv,&CanBase::emit_updata_led,this,&DeviceWidget::update_led);
connect(canRecv,&CanBase::emit_init_led,this,&DeviceWidget::init_led);
运行结果及详细报错内容

work_thread 可以被执行,update_led与init_led 没有被触发

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

我通过断点调试的方式可以确定emit_updata_led和emit_init_led都已经发送
但如果我直接把canRecv定义为某一个类型,如canRecv = new CCanFdRecver; 那么所有函数都可以正常执行。

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

希望可以解决运行多态时,update_led与init_led 没有被触发的问题

  • 写回答

2条回答 默认 最新

  • ShowMeAI 2022-12-08 12:00
    关注

    您可以在主线程和子线程之间使用信号和槽来进行通信,但是,如果您想要在子线程中直接调用主线程中的槽函数,您需要使用 Qt 的事件机制来实现。您可以在子线程中使用 QApplication::postEvent() 来将事件发送到主线程的事件队列,然后在主线程中重写 QObject::event() 来处理事件,并调用对应的槽函数。

    评论

报告相同问题?

问题事件

  • 修改了问题 12月8日
  • 创建了问题 12月8日

悬赏问题

  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败
  • ¥15 复合卡卡号轨道写入芯片卡
  • ¥20 基于MATLAB的TDOA
  • ¥15 为啥输入字体突然变了
  • ¥20 已知坐标,换成MATLAB可以用的数据
  • ¥15 这个python五子棋代码的每一句意思是什么啊
  • ¥15 求一段隐藏代码,隐藏一些内容