Qt学习(七) QMessageBox弹出的对话框关闭后,整个程序退出的解决方法

    这两天,将Qt的基础看了一下,决定尝试做个截图的小程序,稍后会单独写一篇文章,这里先将遇到的一个最大的问题以及解决方法写出来,以作备份之用。

    问题描述:使用QMessageBox弹出一个对话框后,点击这个对话框上的按钮,或是直接关闭这个对话框时,整个程序就退出了。

    具体情况:当在主窗体显示的时候,通过按钮弹出一个QMessageBox没问题,但是当主窗口隐藏的时候,通过热键呼出一个QMessageBox,当关闭这个QMessageBox后,整个程序就退出了。

    因为原来在VC下的MessageBox没有这个问题,我一直以为是我程序那里出错了,一遍遍的检查各个signal和slot,结果自然是什么都没查出来。今天早上重新调试,把QMessageBox的代码删了,发现问题竟然是在QMessageBox本身。

    查Assistant:

void QGuiApplication::lastWindowClosed() [signal]
This signal is emitted from exec() when the last visible primary window (i.e. window with no parent) is closed.

By default, QGuiApplication quits after this signal is emitted. This feature can be turned off by setting quitOnLastWindowClosed to false.

quitOnLastWindowClosed : bool
This property holds whether the application implicitly quits when the last window is closed.

The default is true.

If this property is true, the applications quits when the last visible primary window (i.e. window with no parent) is closed.

Access functions:

bool	quitOnLastWindowClosed()
void	setQuitOnLastWindowClosed(bool quit)


    解决方法:QMessageBox弹出前加一句:

QApplication::setQuitOnLastWindowClosed(false);


  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
关闭QMessageBox对话框时,整个程序退出的问题可能由于程序中没有处理关闭事件导致的。通常情况下,QMessageBox的exec()函数会阻塞程序直到对话框关闭。当对话框关闭时,exec()函数会返回一个结果码,表示用户点击了哪个按钮。常见的返回结果码包括QMessageBox::Yes、QMessageBox::No、QMessageBox::Cancel等。 为了解决整个程序退出的问题,可以通过在程序中重写关闭事件处理函数来捕捉对话框关闭事件。在关闭事件处理函数中,可以判断是否是QMessageBox对话框关闭事件,并根据需要做出相应的处理,例如忽略关闭事件或者执行其他操作。 以下是一个示例代码,展示了如何重写关闭事件处理函数来避免整个程序退出: ``` #include <QApplication> #include <QMessageBox> #include <QWidget> class MyWidget : public QWidget { protected: void closeEvent(QCloseEvent* event) override { // 判断是否是QMessageBox对话框关闭事件 if (dynamic_cast<QMessageBox*>(this->sender())) { // 忽略关闭事件,阻止程序退出 event->ignore(); } else { // 执行其他操作或者调用父类关闭事件处理函数 QWidget::closeEvent(event); } } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); MyWidget widget; widget.show(); QMessageBox messageBox(QMessageBox::Question, "Title", "Text", QMessageBox::Yes | QMessageBox::No); messageBox.exec(); return a.exec(); } ``` 通过重写关闭事件处理函数,我们在关闭QMessageBox对话框时可以选择忽略关闭事件,从而避免整个程序退出。这样,当用户关闭QMessageBox对话框后,程序会继续执行接下来的代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Qt学习) QMessageBox弹出对话框关闭后,整个程序退出解决方法](https://blog.csdn.net/qq_16542775/article/details/103242957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Qt-QMessageBox用法详解](https://blog.csdn.net/u011555996/article/details/122153554)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值