如何使QMessageBox为非模态的?

TT_*_*TT_ 2 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();
Run Code Online (Sandbox Code Playgroud)

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

msgBox.setModal(false);
Run Code Online (Sandbox Code Playgroud)

但是msgBox仍然阻止我关闭另一个对话框。我想念什么?也许问题出在exec()?

Moh*_*nan 5

如果您想要nonmodal(非阻塞)对话框/ 消息框,则不要使用exec(),而是show()将消息框设置setModalfalse。但是,如果您从插槽/功能中执行此操作,则示例中声明的消息框将不会保留,因为其作用域(生存期)在插槽/方法执行结束时到期。因此,您需要使用指针或使其成为成员来延长其寿命。例如,您可能有以下位置:

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();
}
Run Code Online (Sandbox Code Playgroud)

根据我的测试,可以在消息框仍显示时关闭其他对话框,但是如果它阻止您处理/使用其他窗口,直到cancel单击该对话框!在这种情况下,您将需要在单独的线程中启动它,并继续与其他窗口/对话框进行交互。