今天遇到一个奇葩问题,就明明自定义信号只触发一次,然后槽函数却执行多次。今天和同事联调一个程序,期间解决了不少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);
这样的话,每次新建窗体就创建信号槽,关闭窗体就释放信号和槽。保证槽函数只执行一次