方法一、

窗口右上角的X按键会导致其在不给出任何提示的情况下直接退出,
当点击右上角的x按键时,会触发Qt中的一个事件处理函数:void QWidget::closeEvent ( QCloseEvent * e ),默认情况该函数无任何提示性消息,如果需提示则需要重写该函数

void Dialog::closeEvent ( QCloseEvent * e )
{if( QMessageBox::question(this,tr("Quit"),tr("Are you sure to quit this application?"),QMessageBox::Yes, QMessageBox::No )== QMessageBox::Yes){e->accept();//不会将事件传递给组件的父组件qDebug()<<"ok";}elsee->ignore();
}

说明:

  • 事件的ignore函数表示忽略事件,将其传到父组件进行处理
  • 事件的accept函数表示接受事件,组件自己进行处理,不会将事件传递给父组件
  • 但是在这个closeEvent函数中,这两个函数尤其不一样的理解:对于窗口关闭QCloseEvent事件,调用accept()意味着 Qt 会停止事件的传播,窗口关闭;调用ignore()则意味着事件继续传播,即阻止窗口关闭。

此外如果需要直接退出某个应用程序,可以直接调用Qt中的一个全局指针:qApp ,全局指针qApp指向全局的QApplication对象。

//在需要停止程序运行的位置直接加入如下代码
#include <QtGui/QApplication>
...qApp->quit();

说明:

  • qApp是一个全局的函数,可以在Qt说明文档中直接找到,不是main函数定义的QApplication对象(QApplication对象也可以退出,使用 app->exit(0);或者 app->quit();具体可以参考【1】)
  • qApp->quit()关闭的是整个应用程序,不只是窗口,
  • 一般情况下关闭窗口应用程序会直接退出,如果要求关闭窗口时,应用程序不退出,则需要设置QApplication的属性:
QApplication::setQuitOnLastWindowClosed(false);

方法二、

QWidget的close槽函数是像widget发送QCloseEvent,如果widget未设置Qt::WA_DeleteOnClose标志的话,将隐藏widget,并不会销毁相关资源。如果设置了该标志,那么会再发送destroy信号,销毁相关资源。

(多说一句:QWindow的close槽是调用destroy来销毁窗口资源的。不过我们一般不直接使用QWindow。)

Qt帮助文档中的介绍:调用close()方法后首先它会向widget发送一个关闭事件(QCloseEvent)。如果widget接受了关闭事件(QCloseEvent),窗口将会隐藏(实际上调用hide())。
如果widget不接受关闭事件,那么窗口将什么也不做。默认情况下widget会接受关闭事件,我们可以重写QCloseEvent事件,可以选择接受或者不接受。如果widget设置了Qt::WA_DeleteOnClose属性,widget将会被释放。不管widget是否可见,关闭事件都会传递给widget。即接收到QCloseEvent事件后,
除了调用hide()方法将窗口隐藏,同时会调用deleteLater()方法将窗口释放掉,不会再占用资源。所以说调用close()并不一定就会将窗口对象销毁。而只有设置了 Qt::WA_DeleteOnClose属性才会删除销毁。如果这个属性没有设置,close()的作用和hide(),
setvisible(false)一样,只会隐藏窗口对象而已,并不会销毁该对象。

这样的话我们可以给QLabel(拿它当一个例子)设置Qt::WA_DeleteOnClose

QLabel *label = new QLabel;
label->setAttribute(Qt::WA_DeleteOnClose);

之后用connect使用label的destroyed信号绑定一个槽函数即可

connect(label, &QLabel::destroyed, this, [=]() {QString file_path = QFileDialog::getSaveFileName(this, "save file", "tmp.png", "(*.png);;all files(*.*)");if(!file_path.isEmpty())......
});

原文链接:Qt关于窗口关闭触发函数/信号-Qt开发中文网

Qt关于窗口关闭触发函数/信号相关推荐

  1. Qt捕捉窗口关闭事件

    Qt捕捉窗口关闭事件 有时候我们希望在关闭窗口之前做一些操作,例如保存缓存数据或向用户提示是否关闭窗口等等. 由于一般的窗口都是继承自QWidget, 那么我们可以通过覆盖QWidget中的虚函数cl ...

  2. qt 主窗口关闭时关闭子窗口

    1.this指定主窗口为父类 void MainWindow::on_pushButton_clicked() {Dialog *aa = new Dialog(this);aa->show() ...

  3. Qt程序窗口关闭不退出而最小化到托盘的方法

    一.描述 为避免错点关闭按钮,使得软件关闭退出.需要开发一种类似于QQ桌面之类的功能,点击关闭按钮并不退出,开发的应用程序在用户鼠标点击右上角的关闭按钮时,程序不退出,缩小到右下角,进入托盘.例如wi ...

  4. linux 界面工具 qt,Qt主窗口中的工具栏

    工具栏类 QToolBar 快捷项 QAcitonQToolBar* tb = addToolBar("Tool Bar");//addToolBar是Qt主窗口的成员函数,在主窗 ...

  5. qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...

    前言勇哥对于C语言,C++早些年有一些接触,这个系列贴子就记载一下C++应用框架的学习经验. 在写程序时,UI.基础类库.应用程序框架对于vc来讲,只能依靠MFC和QT了. 勇哥对MFC有很强的抵触, ...

  6. qt窗口关闭退出程序_Qt5 窗口关闭信号的响应~

    有时候我们会有这样的需求: 窗口关闭信号触发之前响应一些什么东西~ 需要用到QCloseEvent #include The QCloseEvent class contains parameters ...

  7. 自定义WPF关闭窗口事件触发的函数

    背景: 例如我在点击窗口关闭按钮时候要执行的函数有一个,名为 Window_Closing 那么我需要在界面控件初始化后添加到Closing中 public SerialOption(){Initia ...

  8. QT 应用程序关闭某个窗口时,关闭打开的所有其他窗口并退出程序 【转】

    原文:http://blog.csdn.net/yangyunfeizj/article/details/7398023# 项目中当关闭主窗口时,需要将同时打开的其他窗口关闭,并退出应用程序,实现方法 ...

  9. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消 ...

最新文章

  1. Guide To Using The Gnosis Multisig Wallet
  2. C# 站点IP访问频率限制 针对单个站点
  3. .NET 开源项目 StreamJsonRpc 介绍[上篇]
  4. 从源码的角度说说Activity的setContentView的原理
  5. html频谱跳动效果,HTML5音频可视化频谱跳动代码
  6. github上成员贡献量_真祖传代码!你的GitHub代码已打包运往北极,传给1000年后人类...
  7. Java7 一些新特性及脚本语言支持API--笔记
  8. FTP、WEB虚拟目录作用
  9. BZOJ 2761: [JLOI2011]不重复数字( )
  10. jquery weui 显示loading
  11. 单片机控制步进电机正反转c语言程序,单片机控制步进电机1步10步100步正反转...
  12. 查询数据库有哪些表,有多少张表 sql语句
  13. python做ui界面_从零开始创建UI
  14. 关于注册时验证邮箱,并实现类似安卓的吐丝效果
  15. pr_debug打印输出
  16. 2017.11.15作业
  17. android studio怎么改软件扫码界面_一文入门Android逆向
  18. 如何高效进行出货复核作业,提升出货准确率?
  19. 支付宝APP支付之查看支付宝商户ID
  20. Java 中验证时间格式的 4 种方法

热门文章

  1. Elasticsearch: 使用 Debian 安装包来安装 Elasticsearch 8.x
  2. Android--设计模式
  3. python正则取反_python 正则表达式
  4. GitHub上排名前100的Android开源库
  5. 男子因没戴口罩被公司开除是否合法
  6. HTTP和HTTPS的区别以及加密方式
  7. android项目 用手机,基于Android平台的手机记账应用开发全程实录|Android项目手机记账应用...
  8. 特殊符号无法识别问题
  9. hadoop fs -cp
  10. 汉字里最容易弄混的四个字“祇、祗、衹、袛”