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())
            ...... });
  • 相关阅读:
    angluar项目里用ant.design组件库做排序功能,可以接口排序,可以组件库做
    echarts箱线图例子分析
    echarts的盒须图问题自问自答自己改造例子
    把数组改成echarts中dataset所需的二维数组
    echarts的markline个性化
    echarts使用dataset实现双y轴效果
    echarts散点图例子scatter-weight折腾记之echarts参数修改
    echarts灵活利用dataset生成多个散点图的例子
    echarts用dataset实现之散点图例子Basic Scatter Chart
    随机字符串生成指定范围内的某个数值
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/15078613.html
Copyright © 2011-2022 走看看