在槽函数中使用模态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;
}

参考资料:https://www.cnblogs.com/littleheadache/p/16833752.html

it
除非特别注明,本页内容采用以下授权方式: Creative Commons Attribution-ShareAlike 3.0 License