0
点赞
收藏
分享

微信扫一扫

qt信号槽踩坑日记(信号执行一次,槽函数执行多次解决方案)

_铁马冰河_ 2022-02-24 阅读 78

今天遇到一个奇葩问题,就明明自定义信号只触发一次,然后槽函数却执行多次。今天和同事联调一个程序,期间解决了不少bug。但是调到最后发现,信号触发一次。结果槽函数执行多次。找了半天不知道啥原因。
看下我写的信号槽:

connect(m_pUpdateRackDialog, &EP_Dialog::sSnedClose, this, &EP_UpdateFirmWare::onResetAllUpdateValue);
	connect(this, &EP_UpdateFirmWare::sSendRackVersion, m_pUpdateRackWgt, &EP_UpdateRackWgt::onReceiverRackVersion);
	connect(this, &EP_UpdateFirmWare::sSendRackFrame, m_pUpdateRackWgt, &EP_UpdateRackWgt::onReceiverRackFrame);
	connect(this, &EP_UpdateFirmWare::sSendRackFinished, m_pUpdateRackWgt, &EP_UpdateRackWgt::onReceiverRackFinished);
	connect(this, &EP_UpdateFirmWare::sSendRackStatus, m_pUpdateRackWgt, &EP_UpdateRackWgt::onReceiverRackStatus);
	connect(m_pUpdateRackWgt, &EP_UpdateRackWgt::sSendUIValue, this, &EP_UpdateFirmWare::onSetRackValue);
	connect(m_pUpdateRackWgt, &EP_UpdateRackWgt::sSendUpdateFailed, this, &EP_UpdateFirmWare::onSetRackFailed);
	connect(m_pUpdateRackWgt, &EP_UpdateRackWgt::sSendMaxUIValue, this, &EP_UpdateFirmWare::onSetRackMaxValue);

由于项目需要我是要频繁创建这个窗体的。这里就产生了一个bug,qt的信号和槽是创建在多线程里面的。所以,即使我在关闭窗口的时候做了释放,但是信号槽依然存在。当你下次在打开窗体,它又会创建一个同样的信号和槽,最终导致执行多次槽函数。
解决方案:使用disconnect
在关闭窗体的时候将所有的信号和槽释放
代码如下:

disconnect(m_pUpdateRackDialog, &EP_Dialog::sSnedClose, this, &EP_UpdateFirmWare::onResetAllUpdateValue);
		disconnect(this, &EP_UpdateFirmWare::sSendRackVersion, m_pUpdateRackWgt, &EP_UpdateRackWgt::onReceiverRackVersion);
		disconnect(this, &EP_UpdateFirmWare::sSendRackFrame, m_pUpdateRackWgt, &EP_UpdateRackWgt::onReceiverRackFrame);
		disconnect(this, &EP_UpdateFirmWare::sSendRackFinished, m_pUpdateRackWgt, &EP_UpdateRackWgt::onReceiverRackFinished);
		disconnect(this, &EP_UpdateFirmWare::sSendRackStatus, m_pUpdateRackWgt, &EP_UpdateRackWgt::onReceiverRackStatus);
		disconnect(m_pUpdateRackWgt, &EP_UpdateRackWgt::sSendUIValue, this, &EP_UpdateFirmWare::onSetRackValue);
		disconnect(m_pUpdateRackWgt, &EP_UpdateRackWgt::sSendUpdateFailed, this, &EP_UpdateFirmWare::onSetRackFailed);
		disconnect(m_pUpdateRackWgt, &EP_UpdateRackWgt::sSendMaxUIValue, this, &EP_UpdateFirmWare::onSetRackMaxValue);

这样的话,每次新建窗体就创建信号槽,关闭窗体就释放信号和槽。保证槽函数只执行一次

举报

相关推荐

0 条评论