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

今天遇到一个奇葩问题,就明明自定义信号只触发一次,然后槽函数却执行多次。今天和同事联调一个程序,期间解决了不少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);

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油小杜(接qt定制功能,单模块开发等)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值