我的程序需要支持不同的设备,所以用了运行多态的方法,3个类都继承一个基类,通过运行时确定运行哪一个类
发现主线程发信号触发子线程的槽函数可以执行 , 但是子线程的信号无法触发主线程的槽函数;
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 没有被触发
我通过断点调试的方式可以确定emit_updata_led和emit_init_led都已经发送
但如果我直接把canRecv定义为某一个类型,如canRecv = new CCanFdRecver; 那么所有函数都可以正常执行。
希望可以解决运行多态时,update_led与init_led 没有被触发的问题
您可以在主线程和子线程之间使用信号和槽来进行通信,但是,如果您想要在子线程中直接调用主线程中的槽函数,您需要使用 Qt 的事件机制来实现。您可以在子线程中使用 QApplication::postEvent() 来将事件发送到主线程的事件队列,然后在主线程中重写 QObject::event() 来处理事件,并调用对应的槽函数。
不知道你具体实现怎样的,我这样写信号是正常的