让Qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性
环境:Desktop Qt 5.4.1 MSVC2013 32bit
需要的库:dwmapi.lib 、user32.lib
需要头文件:<dwmapi.h> 、<windowsx.h>
在要处理的QWidget 构造函数中,添加以下两行:
1  | 
setWindowFlags(Qt::Window | Qt::FramelessWindowHint);  | 
SetWidgetBorderless的实现如下:
1  | 
void SetWidgetBorderless(const QWidget *widget)  | 
这个函数的作用是给无边框窗口加上阴影、Aero Snap以及其他动画特效。
这时窗口还无法手动更改大小,需要更改的话,需要自己实现一个QAbstractNativeEventFilter 类,内容如下:
1  | 
class NativeEventFilter : public QAbstractNativeEventFilter  | 
然后在窗口创建之前,使用QApplication::installNativeEventFilter 方法把监听器注册给主程序。
要手动移动窗口位置的话,还要重截QWidget::mousePressEvent 方法:
1  | 
void MyWidget::mousePressEvent(QMouseEvent *ev)  | 
在实际操作时,有时还需要添加最大化和关闭按扭,这时正常调用QWidget::showMaximized()和QWidget::close() 等Qt自带方法即可。
最终实现效果大概是这样:

缩放动画、阴影什么的和Windows本地窗口一样。
参考链接:https://github.com/deimos1877/BorderlessWindow
https://blog.yeatse.com/2015/03/01/qt-frameless-window/
让Qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性的更多相关文章
- winform 窗体设置成无边框、可拖拽、四周圆角
		
最近做一个及时通讯系统的登录界面,现在将界面用到的无边框.可拖拽.四周圆角的方法分享如下: 1.无边框的窗体: 把FormBorderStyle的属性设置为none 2.可拖拽:private Poi ...
 - Qt无边框窗体-最大化时支持拖拽还原
		
目录 一.概述 二.效果展示 三.demo制作 1.设计窗体 2.双击放大 四.拖拽 五.相关文章 原文链接:Markdown模板 一.概述 用Qt进行开发界面时,既想要实现友好的用户交互又想界面漂亮 ...
 - Qt——透明无边框Widget的bug
		
Experience 最近在封装一些类的时候,打算做一个窗口框架,能实现拖动.缩放.最大最小化.基本样式等功能,可不慎遇见一件无比蛋疼的事情,QWidget最小化后再恢复正常界面,最小化按钮居然仍处于 ...
 - jQuery插件之路(三)——文件上传(支持拖拽上传)
		
好了,这次咱一改往日的作风,就不多说废话了,哈哈.先贴上源代码地址,点击获取.然后直接进入主题啦,当然,如果你觉得我有哪里写的不对或者欠妥的地方,欢迎留言指出.在附上一些代码之前,我们还是先来了解下, ...
 - GMF Q&A(1): 如何让palette支持拖拽(DnD)等10则
		
1,如何让palette支持拖拽(DnD) 在*PaletteFactory类中,把私有类NodeToolEntry 和LinkToolEntry的基类修改为PaletteToolEntry.并在构造 ...
 - .net mvc mssql easyui treegrid 及时 编辑 ,支持拖拽
		
这里提到了,1个问题,怎么扩展 Easyui 参见: http://blog.csdn.net/chenkai6529/article/details/17528833 @{ ViewBag.Titl ...
 - 一个可以自由定制外观、支持拖拽消除的MaterialDesign风格Android BadgeView
		
为了尊重作者,先放上链接:https://github.com/qstumn/BadgeView BadgeView 一个可以自由定制外观.支持拖拽消除的MaterialDesign风格Android ...
 - 关于安装了VMware tools后仍然不支持拖拽文件的问题
		
我在学校机房里面的redhat4上面安装了VMware tools之后能正常支持拖拽,但是我自己电脑上的却不支持,折腾了好久,网上找了很久也还是没有解决,不过发现了一些问题,总结如下:(当然我总结的这 ...
 - 让一个view 或者控件不支持拖拽
		
让一个view 或者控件不支持拖拽: dragView.userInteractionEnabled = NO;
 
随机推荐
- iOS汉字中提取首字母
			
NSMutableString *mutableStr = [[NSMutableString alloc]initWithString:string]; if (CFStringTransform( ...
 - BZOJ2789 : [Poi2012]Letters
			
按照顺序依次找到b串每个字母最后的位置,然后求逆序对. #include<cstdio> #define N 1000010 int n,i,j,k,g[26],nxt[N],bit[N] ...
 - HDU 1561 (树形DP+背包)
			
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1561 题目大意:从树根开始取点.最多取m个点,问最大价值. 解题思路: cost=1的树形背包. 有 ...
 - JavaBean中的get/set 的命名规范
			
最近的struts项目中遇到了这样的问题: 我的action中全局变量明明有getset方法,而且是自动生成的,但是在使用的时候,总是说找不到这个属性的getset方法,取不到从jsp传来 的值, ...
 - 修改setInterval作用域
			
Hello,今天和大家分享如何修改setInterval作用域. 0.引子 最近在做一个项目的时候需要开发一个图片轮播显示的组件,在实现过程中遇到了关于setInterval作用域的问题. Slide ...
 - Html5的DeviceOrientation特性
			
设备定位API 引用W3C中的设备定位API的规范描述可知,该API“……定义了多种新型DOM事件,旨在提供与主机设备相关的物理朝向与运动状态信息.”由API提供的数据产生自多种来源,其中包括设备上的 ...
 - 【wikioi】1222 信与信封问题(二分图+特殊的技巧)
			
http://wikioi.com/problem/1222/ 一开始我就想到这样构图的,即可能的连边.但是似乎无法判断. 然后想来想去想不出来.. 题解: 同样是二分图,将可能的连边,然后跑一次最大 ...
 - "504 Gateway Time-out"
			
"504 Gateway Time-out”是什么意思? 意思为:网关超时!
 - 四、saltstack如何管理对象?
			
实验前环境: [root@super65 ~]# salt-key -L[root@super65 ~]# salt-key -a super65.cn -y salt管理对象简介: saltstac ...
 - _jobdu_1001
			
/************************************************************************/ /* 题目描述: This time, you a ...