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

如何在使用PyWin32原生标题栏的PySide6应用中突破16x16限制增大窗口图标

如何在使用PyWin32原生标题栏的PySide6应用中突破16x16限制增大窗口图标

我之前也碰到过一模一样的问题——用PyWin32启用Windows原生标题栏后,Qt的setWindowIcon只能设置16x16的小图标,标题栏上看起来特别小。这背后的原因其实是:Windows原生标题栏支持多种尺寸的图标(比如32x32、48x48),但Qt默认的setWindowIcon通常只设置了小图标(ICON_SMALL),而没有同步设置大图标(ICON_BIG),加上如果你的图标文件本身只有16x16的尺寸,系统也没法自动放大出清晰的大图标。

下面给你两种可行的解决方案,都是基于你的现有代码修改,不会破坏原生标题栏的功能:


方案一:使用多尺寸ICO图标文件(推荐)

Windows的ICO格式可以包含多个尺寸的图标资源(比如16x16、32x32、48x48),系统会根据场景自动选择合适的尺寸显示。这是最稳妥的方式,能保证在标题栏、任务栏、Alt+Tab预览里都显示清晰的图标。

步骤1:准备多尺寸ICO图标

把你的gt.png转换成包含多尺寸的ICO文件(可以用GIMP、IconWorkshop或者在线ICO转换工具),至少要包含16x16和32x32的尺寸,把它放到你的playback目录下,命名为gt.ico。

步骤2:修改代码设置大图标

在你的enableNativeTitleBar方法里,添加设置大、小图标的Win32 API代码:

def enableNativeTitleBar(self):
    """Enable the native Windows title bar using PyWin32."""
    hwnd = self.winId().__int__()
    style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)
    style = style | win32con.WS_CAPTION | win32con.WS_THICKFRAME
    win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, style)
    win32gui.SetWindowPos(
        hwnd, None, 0, 0, 0, 0,
        win32con.SWP_NOMOVE | win32con.SWP_NOSIZE | win32con.SWP_NOZORDER | win32con.SWP_FRAMECHANGED
    )

    # 新增:设置多尺寸图标到窗口
    icon_path = os.path.join(self.base_path, "gt.ico")
    if os.path.exists(icon_path):
        # 加载32x32的大图标
        hicon_big = win32gui.LoadImage(
            0, icon_path, win32con.IMAGE_ICON, 32, 32,
            win32con.LR_LOADFROMFILE | win32con.LR_SHARED
        )
        # 加载16x16的小图标
        hicon_small = win32gui.LoadImage(
            0, icon_path, win32con.IMAGE_ICON, 16, 16,
            win32con.LR_LOADFROMFILE | win32con.LR_SHARED
        )
        # 发送Windows消息设置大、小图标
        win32gui.SendMessage(hwnd, win32con.WM_SETICON, win32con.ICON_BIG, hicon_big)
        win32gui.SendMessage(hwnd, win32con.WM_SETICON, win32con.ICON_SMALL, hicon_small)

方案二:用PNG文件通过Qt生成多尺寸图标(如果不想换ICO)

如果你坚持使用PNG格式的图标,可以通过Qt的QPixmap生成不同尺寸的图标,再转换成Win32的HICON格式设置到窗口:

修改代码如下

同样在enableNativeTitleBar方法里添加:

def enableNativeTitleBar(self):
    """Enable the native Windows title bar using PyWin32."""
    hwnd = self.winId().__int__()
    style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)
    style = style | win32con.WS_CAPTION | win32con.WS_THICKFRAME
    win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, style)
    win32gui.SetWindowPos(
        hwnd, None, 0, 0, 0, 0,
        win32con.SWP_NOMOVE | win32con.SWP_NOSIZE | win32con.SWP_NOZORDER | win32con.SWP_FRAMECHANGED
    )

    # 新增:用PNG生成多尺寸图标
    icon_path = os.path.join(self.base_path, "gt.png")
    if os.path.exists(icon_path):
        q_icon = QIcon(icon_path)
        # 生成32x32的大图标并转成Win32 HICON
        pixmap_big = q_icon.pixmap(32, 32)
        hicon_big = pixmap_big.toWinHICON()
        # 生成16x16的小图标并转成Win32 HICON
        pixmap_small = q_icon.pixmap(16, 16)
        hicon_small = pixmap_small.toWinHICON()
        # 设置到窗口
        win32gui.SendMessage(hwnd, win32con.WM_SETICON, win32con.ICON_BIG, hicon_big)
        win32gui.SendMessage(hwnd, win32con.WM_SETICON, win32con.ICON_SMALL, hicon_small)

关键注意点

  1. 如果你用方案二,确保你的PNG图标分辨率足够高(比如至少32x32),否则放大后会模糊。
  2. 原来的self.setWindowIcon(QIcon(...))可以保留,它会在Qt的其他场景(比如任务栏预览的小图标)生效,但我们新增的Win32代码会优先控制原生标题栏的图标显示。
  3. 测试时可以切换Windows的显示缩放比例(比如100%、125%),确保图标在不同DPI下都显示正常。

备注:内容来源于stack exchange,提问作者garaw-wx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:59:38