QMessageBox模态与非模态及QT中的exec()

今天在写代码的时候发现模态的消息对话框QMessageBox(继承自QDialog)会阻塞住当前线程,影响程序实现后续的功能。于是改用非模态消息对话框解决阻塞的问题。

模态对话框

默认创建的QMessageBox都是模态的用静态方法创建的QMessageBox也是模态的。

QMessageBox::warning(this, tr("提示"), text, tr(""),tr(""));

非模态对话框

要创建一个非模态(消息)对话框,只能创建一个新的QMessageBox对象。

然后调用setModal方法设置为非模态

QMessageBox* msgBox = new QMessageBox(QMessageBox::Warning,"警告",warnMsg);//参数 Icon icon, const QString &title, const QString &text,
msgBox->setModal(false);//设置为非模态 msgBox->setAttribute(Qt::WA_DeleteOnClose); //关掉消息框后删除指针
msgBox->show();
// msgBox->exec();//使用exec()默认是模态的

也可以用msgBox->open();方法显示QMessageBox对话框。

如果使用msgBox->exec();程序运行后显示的对话框是模态的。

参考:Qt QMessageBox 之模态非模态_江河颂的博客-CSDN博客_qmessagebox 非模态

qt - 如何使 QMessageBox 非模态? - IT工具网 (coder.work) 讲的好

关于exec()

QDialog::exec()

在Qt帮助文档里看到关于

int QDialog::exec()

的介绍。Shows the dialog as a modal dialog, blocking until the user closes it.The function returns a DialogCode result

调用这个方法会显示模态对话框,直到用户关闭了这个对话框。这个方法的返回值是DialogCode result。

官方文档里写到:Avoid using this function; instead, use open().避免使用这个方法,用open方法代替它。

QMessageBox::exec()

[virtual slot] int QDialog::exec()

是重写了QDialog::exec()。调用这个方法会显示模态消息对话框,直到用户关闭了这个对话框。使用带有标准按钮的QMessageBox时,此函数返回一个StandardButton值,指示单击的标准按钮。当使用带有自定义按钮的QMessageBox时,此函数返回一个不透明值;使用clickedButton()确定单击了哪个按钮。

给对话框添加按钮,使用clickedButton()可以确定单击了哪个按钮。

QPushButton* btn = msgBox->addButton("查看",QMessageBox::AcceptRole);//添加按钮到消息对话框
if(msgBox->clickedButton()==btn)//如果btn这个按钮被选中
//后续操作

ps:int QDialog::exec()这个返回值没有用过,不清楚怎么用。

还有很多类拥有exec()这个方法,遇到了再记下来。

 

参考:Qt QDialog简介_Mr.codeee的博客-CSDN博客_qt dialog

Qt中show()与exec() - 小二杰 - 博客园 (cnblogs.com)

Qt事件循环的一些理解(exec、eventloop)-一鸣雨-ChinaUnix博客 讲的好

QT exec()的_秦非文的博客-CSDN博客_qt exec();参考的是上一个链接,里面用到了override重写run方法实现多线程时进入事件循环。

QT中的exec()_orient的博客-CSDN博客 讲到了main函数里的exec()

Qt 主函数中qapplication的exec()过程_坚定-追求的博客-CSDN博客_qapplication exec 讲到了Qt事件源码,没看懂

Qt exec()做了什么_ytoubupa的博客-CSDN博客_qt exec

 

其它

QMessageBox的用法

参考:Qt QMessageBox用法详解 (biancheng.net)

 

posted @ 2022-10-27 22:15  小头痛  阅读(4045)  评论(0编辑  收藏  举报