一、简述

前段时间在使用setWindowFlags方法时遇到了一个坑,具体情况是想通过窗口界面上一个checkBox来控制窗口当前状态是否置顶,而Qt提供了Qt::WindowStaysOnTopHint标志,能够让窗口始终保持在其他窗口前端,也就是将窗口置顶。

理论上,我们在勾选上checkBox之后将Qt::WindowStaysOnTopHint标志设置上,就会将窗口置顶,结果却将窗口隐藏了。那么为什么第二次调用setWindowFlags设置窗口标志位时窗口会隐藏了呢(实际上调用了hide()方法),下面就看一下具体是什么原因导致的。

Qt::WindowStaysOnTopHint

Informs the window system that the window should stay on top of all other windows. Note that on some window managers on X11 you also have to pass Qt::X11BypassWindowManagerHint for this flag to work correctly.

二、分析窗口隐藏原因

首先我们看一下代码,在构造函数中我们绑定checkBox,然后设置窗口属性。

this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);
connect(ui.checkBox, SIGNAL(stateChanged(int)), this, SLOT(onStateChanged(int)));

checkBox状态变化槽函数

void onStateChanged(int state)
{
if (state == Qt::Unchecked)
{
// 未勾选时不置顶;
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);
}
else if (state == Qt::Checked)
{
// 勾选时置顶;
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowStaysOnTopHint);
}
}

想要查找原因,那就得直接看Qt源码呀,所以就直接跟进了qwidget.cpp中的setWindowFlags方法。

调试之后,发现进入了setParent方法,我们仔细看一下,在setParent方法中确实会调用hide方法,那什么时候会调用呢,首先是判断窗口是否被创建,然后是窗口是否被隐藏,也就是如果窗口被创建并且没有被隐藏时会调用hide方法。下面是在构造函数中调用setWindowFlags时,wasCreated为false,也不会调用hide,而且当时窗口并未创建,所以在窗口未创建时无论调用多少次setWindowFlags方法,都会以最后一次调用时传入的参数为准。


下面是在窗口中勾选了checkBox,然后再次调用了setWindowFlags方法,此时满足窗口被创建并且没有被隐藏条件,所以这里调用了hide方法将窗口隐藏了,终于找到了原因。


那么也不是没有办法解决窗口置顶问题,windows提供了SetWindowPos方法解决了窗口置顶的问题。如果我们想一直保持窗口置顶状态也可以在窗口初始化时调用setWindowFlags方法传入Qt::WindowStaysOnTopHint标志即可使窗口置顶。

如果两个窗口都是置顶状态,如果层叠在一起也会相互覆盖。

void onStateChanged(int state)
{
if (state == Qt::Unchecked)
{
::SetWindowPos((HWND)this->winId(), HWND_NOTOPMOST, this->pos().x(), this->pos().y(), width(), height(), SWP_SHOWWINDOW);
}
else if (state == Qt::Checked)
{
::SetWindowPos((HWND)this->winId(), HWND_TOPMOST, this->pos().x(), this->pos().y(), width(), height(), SWP_SHOWWINDOW);
}
}
 
 

http://blog.csdn.net/goforwardtostep/article/details/68938965

Qt之使用setWindowFlags方法遇到的问题(追踪进入QWidget的源码分析原因,最后用WINAPI解决问题)good的更多相关文章

  1. equals和==方法比较(三)--Long中LongCache源码分析

    下面我们来分析,上篇博客中遗留的问题,为什么下方的两个一个是true,两一个是false那? //true Long l1=123l; Long l2=123l; System.out.println ...

  2. equals和==方法比较(二)--Long中equals源码分析

    接上篇,分析equals方法在Long包装类中的重写,其他类及我们自定义的类,同样可以根据需要重新equals方法. equals方法定义 equals方法是Object类中的方法,java中所有的对 ...

  3. QT源码分析(从QApplication开始)

    QT源码分析 转载自:http://no001.blog.51cto.com/1142339/282130 今天,在给同学讲东西的时候,谈到了Qt源代码的问题,才发现自己对Qt机制的了解是在太少了,而 ...

  4. ABP源码分析十五:ABP中的实用扩展方法

    类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an   attribu ...

  5. jQuery实现DOM加载方法源码分析

    传统的判断dom加载的方法 使用 dom0级 onload事件来进行触发所有浏览器都支持在最初是很流行的写法 我们都熟悉这种写法: window.onload=function(){ ... }  但 ...

  6. jQuery原型方法.pushStack源码分析

    这次分析的方法跟前面不同,虽然pushStack也是原型方法之一,但是我们几乎从不用在页面调用,在参考手册里面也没有这个方法的使用说明,但是这个方法还是非常重要的,在使用很多jQuery的其他方式都会 ...

  7. jQuery原型属性constructor,selector,length,jquery和原型方法size,get,toArray源码分析

    首先看一下在jQuery1.7.1中定义的原型属性和方法有哪些? init方法作为实际的构造函数已经详细分析过了,需要了解可以参考http://www.cnblogs.com/yy-hh/p/4492 ...

  8. jQuery.extend()方法和jQuery.fn.extend()方法源码分析

    这两个方法用的是相同的代码,一个用于给jQuery对象或者普通对象合并属性和方法一个是针对jQuery对象的实例,对于基本用法举几个例子: html代码如下: <!doctype html> ...

  9. jQuery.clean()方法源码分析(一)

    在jQuery 1.7.1中调用jQuery.clean()方法的地方有三处,第一次就是在我之前的随笔分析jQuery.buildFramgment()方法里面的,其实还是构造函数的一部分,在处理诸如 ...

随机推荐

  1. Struts2之配置使用

    重要声明:此次学习struts2使用的版本号为:struts-2.3.15.3.假设是用的其它版本号出现的问题能够联系我. 一. 1.首先就是打开myeclipse创建project名为:struts ...

  2. cxf maven 依赖 No message body writer foud.. contenttype:application/json

    最近使用cxf发布rest服务时遇到了如题的异常,最后发现是缺少依赖的问题.ps:我并没有使用spring cxf基本运行需要如下依赖 1 <dependency> <groupId ...

  3. 一个里程碑,新网站实现全站https

    本地验证node服务没问题后,上传到阿里云服务器上,发现无法访问.一开始以为是SSL证书有问题,去腾讯云SSL证书重新下载,还是不行.然后改node应用文件代码app.js,猜测是crt证书应该改成p ...

  4. Java InputStream、String、File相互转化 --- good

    String --> InputStreamByteArrayInputStream stream = new ByteArrayInputStream(str.getBytes()); Inp ...

  5. 分布式事务slides

    最近看了<分布式系统概念与设计 第 5 版>的分布式事务章节,整理了一份 ppt.还有恢复部分没有收录进来,有空再整理啦. 下面是传到 deckspeaker 上的 slides 展示: ...

  6. 处理EasyUI中tab的切换问题以及accordion左侧导航栏的代码实现

    //左侧导航菜单 function leftMenus() { //$(".easyui-accordion").empty(); $.each(_menus.menus, fun ...

  7. Android--MVP设计模式实践

    MVP设计模式是android开发讨论的很火的一个话题,我对设计模式也有一些拙见,为了实践我的一些想法,我在我最新开发的产品中将我心目中的MVP设计模式进行了实践,最后得到了这样的架构. 特点:简单, ...

  8. Java10 新特性

    Java 10 新特性 这次发布的 Java 10,新带来的特性并不多. 根据官网公开资料,共有 12 个 JEP(JDK Enhancement Proposal 特性加强提议),带来以下加强功能: ...

  9. lua--从白开始(2)

    眼下lua最新的版本号,5.2.3. 这个例子是一个简单lua分析器,来源自<Lua游戏开发实践指南>. 测试程序的功能:解决简单lua说明,例如:print("Hello wo ...

  10. Java中文件的上传与下载

    文件的上传与下载主要用到两种方法: 1.方法一:commons-fileupload.jar  commons-io.jar apache的commons-fileupload实现文件上传,下载 [u ...