专栏首页跟Qt君学编程Qt关闭窗口之小坑

Qt关闭窗口之小坑

❝开发中遇到了关闭窗口右上角"X"号居然不能正常退出程序,而是隐藏了窗口。究竟是什么回事呢? ❞

问题重现

  执行下列代码后点击右上角"X"号居然退出不了程序,而是隐藏了窗口。原以为会恢复正常退出程序的功能,其实不然。

#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    /* 切换到无标题栏模式 */
    w.setWindowFlag(Qt::ToolTip, true);
    
    // ...一些操作
    
    /* 恢复到有标题栏模式 */
    w.setWindowFlag(Qt::ToolTip, false);
    w.show();
    
    return a.exec();
}

  而正常操作下,下列代码点击右上角"X"号可以正常关闭窗口。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    w.show();
    
    return a.exec();
}

问题分析

  通过查看setWindowFlags的源码发现了这个函数adjustQuitOnCloseAttribute,似乎是可以改变了关闭按钮的状态,我们再进入函数一探究竟。

void QWidgetPrivate::setWindowFlags(Qt::WindowFlags flags)
{
    Q_Q(QWidget);
    ...

    if ((q->data->window_flags | flags) & Qt::Window) {
        ...
        // 为了向后兼容,我们只在重新创建窗口时才更改Qt::WA_QuitOnClose属性值。
        adjustQuitOnCloseAttribute();
    }
    ...
}

adjustQuitOnCloseAttribute函数如下:

void QWidgetPrivate::adjustQuitOnCloseAttribute()
{
    Q_Q(QWidget);

    if (!q->parentWidget()) {
        Qt::WindowType type = q->windowType();
        if (type == Qt::Widget || type == Qt::SubWindow)
            type = Qt::Window;
        if (type != Qt::Widget && type != Qt::Window && type != Qt::Dialog)
            q->setAttribute(Qt::WA_QuitOnClose, false);
    }
}

  可以看到,「当窗口类型不是Widget,Window,Dialog时则会设置关闭按钮不处理退出程序的操作。」

if (type != Qt::Widget && type != Qt::Window && type != Qt::Dialog)
    q->setAttribute(Qt::WA_QuitOnClose, false);

问题解决

  设置setAttribute(Qt::WA_QuitOnClose, true)让其恢复关闭按钮退出的作用。

#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    /* 切换到无标题栏模式 */
    w.setWindowFlag(Qt::ToolTip, true);
    
    // ...一些操作
    
    /* 恢复到有标题栏模式 */
    w.setWindowFlag(Qt::ToolTip, false);
    /* 恢复关闭按钮的作用 */
    w.setAttribute(Qt::WA_QuitOnClose, true);
    w.show();
    
    return a.exec();
}

本文分享自微信公众号 - Qt君(qtjuna),作者:Prosa

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Qt 5.14版本正式发布(带下载链接)

      我们今天(2019-12-12)发布了Qt 5.14。该版本以及明年的Qt 5.15 LTS开始为通向Qt 6铺平道路。

    Qt君
  • Qt 5.13版本正式发布(带下载链接)

    今天,我们发布了 Qt 5.13,我为每个人都投入的所有工作感到自豪。与往常一样,我们的版本带有新功能,更新,错误修复和改进。对于Qt 5.13,我...

    Qt君
  • Qt官方示例-Quick Control.1样式

    Qt君
  • Qt 5.13版本正式发布(带下载链接)

    今天,我们发布了 Qt 5.13,我为每个人都投入的所有工作感到自豪。与往常一样,我们的版本带有新功能,更新,错误修复和改进。对于Qt 5.13,我...

    Qt君
  • Qt官方示例-Quick Control.1样式

    Qt君
  • Qt 5.14版本正式发布(带下载链接)

      我们今天(2019-12-12)发布了Qt 5.14。该版本以及明年的Qt 5.15 LTS开始为通向Qt 6铺平道路。

    Qt君
  • C++最好的图形库是什么?

    世界上的GUI库多如牛毛,有的开源,有的收费,有的可以做手机app开发,有的可以做桌面应用,有的只能用在某个系统,有的支持跨平台。基于不同的编程语言,人们又开发...

    Coding十日谈
  • 初学Qt(二) 中高级功能列举

    上一次和大家聊了聊Qt的三大基类,信号和槽的使用以及重新实现一些事件等话题。如果在学习Qt之前有一定的C语言编程,可能对响应界面操作还会有些不习惯。这次聊一聊Q...

    用户5908113
  • 基于NXP i.MX28 MPU的疫情监控平台2-Qt环境搭建

    Qt 是一个跨平台的应用程序开发框架。使用Qt开发的应用程序,只需要编写一套代码,然后把这套代码放在不同平台的Qt环境去编译,就会生成可以运行在对应平台的应用程...

    单片机点灯小能手
  • PyQt中WindowFlags使用详解

    通过 setWindowFlags来设置窗口的 WIndowFlags,多个 WindowFlags之间用 | 连接,如:

    渔父歌

扫码关注云+社区

领取腾讯云代金券