Qt Windows上实现毛玻璃效果
首发于我的个人博客:xie-kang.com
博客内有更多文章,欢迎大家访问
原文地址
前言:
很多人看到这个需求的第一想法都是录制软件窗口后的桌面内容,并且加上个高斯模糊就能实现了。
思路没有错,操作系统提供的API本质也是这样实现的。
但是我们软件是处于用户态的,怎么获取自己窗口背后的内容?当然也只能通过系统API实现!关键是如果你录制或者截图屏幕内容,在一些操作系统,比如macOS上系统会弹窗告知用户是否允许软件录制屏幕,这用户能接受吗?
所以说这么多,使用系统提供的API实现毛玻璃这个方式是最好的。
正文:
win7上可以使用DwmEnableBlurBehindWindow、win10上使用SetWindowCompositionAttribute(MSDN未公开的API)都可以实现毛玻璃的效果;
给Qt窗口设置上 setAttribute(Qt::WA_TranslucentBackground) 属性即可除去背景色将整个窗口透明。
在默认情况下使用SetWindowCompositionAttribute边框会有三条透明边在窗口的四周,因为该API实现的毛玻璃的过程是在窗口后创建了一个包括主窗口阴影的在内的辅助窗口在主窗口之后。

要除去这三条透明边可以使用 setWindowFlag(Qt::FramelessWindowHint) 创建一个无边框的窗口,效果如下:

但有时候出于实际的业务需求或者代码兼容问题我们需要保留窗口的边框,可以考虑以下方案:
1.主窗口使用
QtWin::enableBlurBehindWindow(this);
setAttribute(Qt::WA_TranslucentBackground);
实现带边框的背景透明窗口;

2.创建一个与主窗口宽高一致的Widget(或窗口),将其设置为无边框窗口以及毛玻璃效果,使其实时跟随主窗口的宽高以及大小并保持在主窗口之下;
注:Qt上可以使用QGraphicsBlurEffect实现控件的模糊效果,如果搭配上透明背景是否可以也实现毛玻璃效果呢?这个没有实践。
SetWindowCompositionAttribute使用示例代码:
struct WCAD
{
WindowCompositionAttribute Attribute;
int * Data;
int SizeOfData;
};
typedef int* (*pfun)(HWND hwnd, WCAD *data);
HWND hWnd = HWND(winId());
HMODULE hUser = GetModuleHandle(L"user32.dll");
if (hUser) {
pfun setWindowCompositionAttribute = (pfun)GetProcAddress(hUser, "SetWindowCompositionAttribute");
if (setWindowCompositionAttribute) {
AccentPolicy accent = {3, 0, 0, 0};//ACCENT_ENABLE_BLURBEHIND 具体枚举参加MSDN
WCAD data;
data.Attribute = 19;//WCA_ACCENT_POLICY 具体枚举参加MSDN
data.Data = reinterpret_cast<int *>(&accent) ;
data.SizeOfData = sizeof(accent);
setWindowCompositionAttribute(hWnd, &data);
}
}
参考链接:
MSDN dwmapi: https://docs.microsoft.com/zh-cn/windows/win32/api/dwmapi/nf-dwmapi-dwmsetwindowattribute?redirectedfrom=MSDN
Qt 在win7上实现背景毛玻璃效果的音乐播放器: https://doc.qt.io/qt-5/qtwinextras-musicplayer-example.html
QGraphicsBlurEffect类说明: https://doc.qt.io/qt-5/qgraphicsblureffect.html
SetWindowCompositionAttribute 各设置的对比(c#): https://blog.csdn.net/wpwalter/article/details/103268596
Qt Windows上实现毛玻璃效果的更多相关文章
- 让Qt支持Win7的Aero和毛玻璃效果
Qt5增加了许多特性,其中 Qt Windows Extras 模块就增加了对Win7 Aero 效果的支持. 官网的介绍如下: Qt Windows Extras provide classes a ...
- windows上的Qt 5的依赖部署打包
通常我们编译Qt程序的时候最终会生成exe或dll,这些可执行文件都会有Qt模块的依赖,如果项目一旦庞大,就不是很好看出缺了什么模块,导致安装包安装到其他绿色干净的windows机器上会提示缺少XXX ...
- 【Qt开发】Qt Creator在Windows上的调试器安装与配置
Qt Creator在Windows上的调试器安装与配置 如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试 ...
- 普通键盘Windows上虚拟Cherry机械键盘效果的方法
草台班子--普通键盘Windows上虚拟Cherry机械键盘效果的方法 机械键盘以其独特的手感.绚丽的外形,还有那人神共愤的音效吸引着大批爱好者.最近iQQO 3的机械键盘效果更是吸引了更多 ...
- Qt开发笔记:OpenSSL库介绍、windows上mingw32版本的OpenSSL编译模块化
前言 Windows上mingw32版本的openssl的编译是属于比较棘手的,OpenSSL本身不提供支持.. OpenSSL 介绍 OpenSSL是一个开放源代码的软件库包,应用程序可 ...
- qt qml fuzzyPanel 毛玻璃效果
毛玻璃效果,用qml来写代码真是简短,大爱qml:) [下载地址]http://download.csdn.net/detail/surfsky/8426641 [核心代码] Rectangle{ c ...
- Qt Windows下链接子系统与入口函数(终结版)(可同时存在main和WinMain函数)
Qt Windows下链接子系统与入口函数(终结版) 转载自:http://blog.csdn.net/dbzhang800/article/details/6358996 能力所限,本讨论仅局限于M ...
- (转)Windows上使用CMake
CMake简介 原文:http://blog.gclxry.com/use-cmake-on-windows/ 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软 ...
- 使用CSS3制作导航条和毛玻璃效果
导航条对于每一个Web前端攻城狮来说并不陌生,但是毛玻璃可能会相对陌生一些.简单的说,毛玻璃其实就是让图片或者背景使用相应的方法进行模糊处理.这种效果对用户来说是十分具有视觉冲击力的. 本次分享的主题 ...
- Swift 之模糊效果(毛玻璃效果,虚化效果)的实现
前言: 之前项目中有用到过Objective-C的的模糊效果,感觉很是不错,而且iOS8之后官方SDK也直接提供了可以实现毛玻璃效果的三个类:UIBlurEffect.UIVibrancyEffect ...
随机推荐
- sublime自动添加注释
Step1: 需要使用组合键command+shift+p 搜索Install Package 后回车 确定 Step2: 经过上一步回车后到达第二步(可能需要等待一会儿),会出现搜索框,搜索DocB ...
- go-bindata安装问题
问题描述使用命令 go get -u github.com/jteeuwen/go-bindata/... 报错: go get -u github.com/go-bindata/go-bindata ...
- golang 指针
一个指针变量指向了一个值的内存地址,类似于变量和常量,在使用指针前你需要声明指针. 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置.使用&字符放在变量前面对变量进行" ...
- Spring框架常用依赖配置--供使用时直接复制
Spring框架常用依赖配置--供使用时直接复制 以下仅为本人工作.学习过程中所接触到的内容,不足之处请多包涵. <properties> <org.springframework. ...
- 063_Apex 的 Test类说明
@isTest public class TestUtil { public static void createTestAccounts() { // Create some test accoun ...
- Alfred 好用工具分享
好用的mac工具分享 1.带历史记录的剪切板 根据快捷键切换选择保存的数据 2.创建热键工作流程 将常用的工具变为热键,快捷切换 如何创建: 设置热键 单击右键 创建actions 打开app 然后将 ...
- 【git】 的基本命令
1.push命令: 2.pull命令: 3.commit命令: 4.add命令: 5.checkout命令: 6.fetch/clone命令. 7.版本回退 git log 查看版本号(每次提交 ...
- 开发Unity3D移动端输入插件 UGUI Touch Input Component
UGUI Touch Input Component 为了在移动设备上操控角色,本人便开发了UGUI Touch Input Component输入类插件. 特点 本插件中总共包含三种组件:the v ...
- django前后端分离接口开发
用django进行接口开发 接口: /api/parameter (同一个接口地址实现不同的请求方式) 全局参数(get,post,put,delete) GET:获取全局参数的所有数据 POST:创 ...
- list与linkedlist(添加、删除元素)
1)jdk1.8中list遍历过程中可以直接删除元素了(jdk1.7可以通过倒序遍历删除或iterator遍历删除元素) List<Integer> list = new ArrayLis ...