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 ...
随机推荐
- 理解函数调用_使用arguments参数对所有函数参数执行操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ABAP 报表的两种下钻功能
在报表开发中往往会由需求要求跳转,SAP中提供了一些下钻的方式. 这里主要介绍两种 submit 和 call transaction submit 引用的是报表名称,以自开发报表居多 call tr ...
- Java流程控制练习
练习 打印三角形及Debug的使用 public class TestDemo { public static void main(String[] args) { //打印三角形 5行 for(in ...
- [jQuery]z-index属性大于0的元素使用fadeIn无法正常过渡的问题
rt 问题记录. 尝试使用$(' ').animate({ opacity: 1 }) 会出现相同的问题. 可能是opacity动画与z-index无法兼容(?) 最后的处理方式是改变元素渲染顺 ...
- Docker--结合 Jenkins + Gitlab 完成自动化测试的持续集成实战
本文转自:https://www.cnblogs.com/poloyy/p/13971134.html 进入 Jenkins 任务的配置页面 源码管理 构建触发器 为了安全起见生成一个 token 值 ...
- string 截取分割定位
截取 public String substring(int beginIndex, int endIndex),返回新的字符串,参数为 前闭后开 public String substring(in ...
- ufun对象->NXopen
Body *body1(dynamic_cast<Body *>(NXObjectManager::Get(SolidVector[i]))); std::vector<Face*& ...
- npm config get prefer-offline
npm config get prefer-offline
- 快速了解 Kubernetes 的架构及特性
kubernetes 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群.滚动升级回滚.弹性伸缩.自动治愈.服务发现等多种特性能力.本文将带着大家快速了解 kubernetes ,了 ...
- 使用 Application Loader 上传 IPA 包失败。提示信息:Please sign in with an app-specific password. You can create one at appleid.apple.com
摘自:https://www.cnblogs.com/strengthen/p/10881085.html 更新APP,使用 Application Loader 上传 IPA 包失败.提示信息:Pl ...