在槽函数中使用模态QMessageBox可能诱发意外的段错误
一个项目中包含一个Qt槽函数,该槽函数包含一个模态QMessageBox调用。但在实际使用中发现关闭该QMessageBox后会诱发段错误(SEGEV)。检查Stack Trace发现该问题发生在qt_static_metacall()的过程中。进一步排查发现该槽函数绑定的信号发生源会在emit信号后调用deleteLater()删除自身。推测该故障系由模态QMessageBox返回时信号源已被事件循环删除、而qt_static_metacall()仍试图返回导致的。
解决方案是使用非模态QMessageBox:
void MyObject::MySlot(){
//Event handler
//...
//Show non-modal message box, to avoid execptions
QMessageBox * msgBox = new QMessageBox(QMessageBox::Information, tr("Title"), tr("Info"));
msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->setModal(false);
msgBox->show();
return;
}
页面版本: 2, 最后编辑于: 30 Oct 2023 03:48