zoukankan      html  css  js  c++  java
  • qt关于窗口关闭触发函数/信号

    方法一、

    窗口右上角的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";
        }
        else
          e->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())
            ...... });
  • 相关阅读:
    GitLab 介绍
    git 标签
    git 分支
    git 仓库 撤销提交 git reset and 查看本地历史操作 git reflog
    git 仓库 回退功能 git checkout
    python 并发编程 多进程 练习题
    git 命令 查看历史提交 git log
    git 命令 git diff 查看 Git 区域文件的具体改动
    POJ 2608
    POJ 2610
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/15078613.html
Copyright © 2011-2022 走看看