Qt 如何使QMessageBox非模态?

Qt 如何使QMessageBox非模态?,qt,modal-dialog,messagebox,Qt,Modal Dialog,Messagebox,我正在尝试创建非模态QMessageBox: QMessageBox msgBox( pParentWindow ); msgBox.setWindowModality(Qt::WindowModal); msgBox.setIcon( QMessageBox::Warning ); msgBox.setText( headerMsg.c_str() ); QAbstractButton *btnCancel = msgBox.addButton( "Cancel", QMessageBox:

我正在尝试创建非模态QMessageBox:

QMessageBox msgBox( pParentWindow );
msgBox.setWindowModality(Qt::WindowModal);
msgBox.setIcon( QMessageBox::Warning );
msgBox.setText( headerMsg.c_str() );
QAbstractButton *btnCancel =  msgBox.addButton( "Cancel", QMessageBox::RejectRole );
msgBox.exec();
(这是一个简化的示例)。问题是,这仍然是模态:我可以移动另一个(非父)对话框,但无法关闭它。我还尝试:

msgBox.setModal(false);
但是msgBox仍然阻止我关闭另一个对话框。我错过了什么?
也许问题出在exec()上

如果您想要
非模态
(非阻塞)对话框/消息框,那么“是”不使用
exec()
,只需
show()
消息框,同时将
setModal
设置为
false
。但是,如果从插槽/函数中执行此操作,那么示例中声明的messagebox将不会持久,因为它的作用域(生存期)将在插槽/方法执行结束时过期。因此,您需要使用指针或使其成为成员来延长其生命周期。例如,您可以使用以下插槽:

void MainWindow::popMessageBox()
{
 QMessageBox *msgBox = new QMessageBox(pParentWindow);
 msgBox->setIcon( QMessageBox::Warning );
 msgBox->setText(headerMsg.c_str());
 QPushButton *btnCancel =  msgBox->addButton( "Cancel", QMessageBox::RejectRole );
 msgBox->setAttribute(Qt::WA_DeleteOnClose); // delete pointer after close
 msgBox->setModal(false);
 msgBox->show();
}
在我的测试中,当messagebox仍然显示时,关闭其他对话框是可能的,但是如果它阻止您处理/使用其他窗口,直到单击
cancel
!在这种情况下,您需要在单独的线程中启动它,并继续与其他窗口/对话框交互。

相关: