You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:15:06