如何在使用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)
关键注意点
- 如果你用方案二,确保你的PNG图标分辨率足够高(比如至少32x32),否则放大后会模糊。
- 原来的
self.setWindowIcon(QIcon(...))可以保留,它会在Qt的其他场景(比如任务栏预览的小图标)生效,但我们新增的Win32代码会优先控制原生标题栏的图标显示。 - 测试时可以切换Windows的显示缩放比例(比如100%、125%),确保图标在不同DPI下都显示正常。
备注:内容来源于stack exchange,提问作者garaw-wx
相关产品推荐
相关产品推荐

