如何使QMessageBox非模态?

时间:2018-03-13 22:36:28

标签: 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::RejectRole );
msgBox.exec();

(这是一个简化的例子)。问题是,这仍然是模态的:我可以移动另一个(非父)对话框,但我无法关闭它。我也尝试过:

msgBox.setModal(false);

但是msgBox仍然阻止我关闭其他对话框。我错过了什么? 也许问题是exec()?

1 个答案:

答案 0 :(得分:3)

如果您想要nonmodal(非阻止)对话框/ MessageBox,则将exec()设置为{时,请勿使用show(),而只使用setModal消息框{1}}。但是如果从插槽/函数中执行此操作,则示例中声明的消息框将不会保留,因为其范围(生存期)在插槽/方法执行结束时到期。因此,您需要使用指针或使其成员延长其生命周期。例如,你可以有这个插槽:

false

在我测试时,可以在消息框显示时关闭其他对话框,但如果它阻止您在单击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(); } 之前处理/使用其他窗口!在这种情况下,您需要在单独的线程中启动它,并继续与其他窗口/对话框进行交互。

相关问题