首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Qt关闭窗口之小坑

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

问题重现

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

#include

#include

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

#include

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();

}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200313A0W7K900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券