如何在Qt6 QWidget中通过Win32 API实现背景模糊效果?
如何在Qt6 Widget中应用Win32 API实现的背景模糊效果
核心思路
你找到的Win32 API代码通过SetWindowCompositionAttribute设置系统级窗口模糊效果,要在Qt中复用该逻辑,核心是获取Qt Widget对应的原生Win32句柄(HWND),然后调用模糊设置函数,同时调整Qt窗口属性避免效果冲突。
具体步骤及代码实现
1. 移植Win32模糊函数到Qt项目
直接将Win32代码中的SetWindowBlur函数复制到Qt类中,需引入windows.h头文件,并在项目配置中链接user32.lib。
2. 获取Qt Widget的HWND并触发模糊设置
Qt的QWidget提供winId()方法返回原生HWND,但要确保窗口已完成创建,因此在showEvent中调用模糊设置更可靠(构造函数执行时HWND可能未生成)。
3. 调整Qt窗口属性与绘制逻辑
保留Qt::FramelessWindowHint和Qt::WA_TranslucentBackground属性,避免绘制不透明背景覆盖系统模糊效果,可选择绘制低透明度背景叠加模糊,或直接绘制内容。
完整修改后的代码
#include <QWidget> #include <QPainter> #include <windows.h> // 引入Win32 API头文件 class Qt6WinAPI_Test : public QWidget { Q_OBJECT public: Qt6WinAPI_Test(QWidget *parent = nullptr) : QWidget(parent) { setWindowFlag(Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground); resize(640, 480); // 设置窗口初始大小 } protected: void showEvent(QShowEvent *event) override { QWidget::showEvent(event); // 获取Qt窗口的HWND并应用模糊效果 HWND hWnd = reinterpret_cast<HWND>(winId()); SetWindowBlur(hWnd); } void paintEvent(QPaintEvent* event) override { QPainter painter(this); // 可选:绘制低透明度背景叠加模糊效果,或直接绘制内容 painter.fillRect(rect(), QColor(255, 255, 255, 50)); // 示例:绘制文本 painter.setPen(Qt::white); painter.drawText(10, 30, "Hello, Qt with Win32 Blur!"); } private: void SetWindowBlur(HWND hWnd) { const HINSTANCE hModule = LoadLibrary(TEXT("user32.dll")); if (hModule) { struct ACCENTPOLICY { int nAccentState; int nFlags; int nColor; int nAnimationId; }; struct WINCOMPATTRDATA { int nAttribute; PVOID pData; ULONG ulDataSize; }; typedef BOOL(WINAPI* pSetWindowCompositionAttribute)(HWND, WINCOMPATTRDATA*); const pSetWindowCompositionAttribute SetWindowCompositionAttribute = reinterpret_cast<pSetWindowCompositionAttribute>(GetProcAddress(hModule, "SetWindowCompositionAttribute")); if (SetWindowCompositionAttribute) { ACCENTPOLICY policy = { 3, 0, 0, 0 }; // 3对应ACENT_ENABLE_BLURBEHIND,开启背景模糊 WINCOMPATTRDATA data = { 19, &policy, sizeof(ACCENTPOLICY) }; // 19对应WCA_ACCENT_POLICY SetWindowCompositionAttribute(hWnd, &data); } FreeLibrary(hModule); } } };
项目配置补充
在Qt项目的.pro文件中添加以下配置,确保链接Win32的user32库:
LIBS += -luser32
关键细节说明
ACCENTPOLICY.nAccentState = 3:对应Windows系统的ACENT_ENABLE_BLURBEHIND常量,是开启背景模糊的核心参数。Qt::WA_TranslucentBackground:必须开启,否则Qt会默认绘制不透明背景,覆盖系统模糊效果。showEvent触发时机:窗口第一次显示时触发,此时HWND已完全创建,能确保模糊设置生效。
内容的提问来源于stack exchange,提问作者Finchi
相关产品推荐
相关产品推荐

