如何在PySide 6.7中控制Windows主题下的标题栏颜色
控制PySide6窗口标题栏的深色/浅色显示
可以通过编程方式强制控制Windows平台下PySide6窗口标题栏的显示模式,以下是两种可行方案:
方案一:调用Windows DWM API(推荐)
利用Windows桌面窗口管理器(DWM)的DwmSetWindowAttribute函数,直接设置窗口标题栏是否使用深色模式,这种方式简单高效,且保留系统原生标题栏的交互逻辑。
实现代码
import sys import ctypes from PySide6.QtWidgets import QApplication, QMainWindow # DWM属性常量:启用沉浸式深色模式 DWMWA_USE_IMMERSIVE_DARK_MODE = 20 class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("TitleBar Control Example") self.resize(300, 200) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() # 获取窗口的Windows句柄(必须在窗口show之后调用) hwnd = window.windowHandle().winId() # 设置标题栏模式:1=强制深色,0=强制浅色 force_dark = 1 ctypes.windll.dwmapi.DwmSetWindowAttribute( hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, ctypes.byref(ctypes.c_int(force_dark)), ctypes.sizeof(ctypes.c_int(force_dark)) ) sys.exit(app.exec())
注意事项
- 仅支持Windows 10 1809及以上版本、Windows 11
- 必须在窗口
show()之后调用,否则无法获取有效的窗口句柄 - 若需要动态切换,可通过按钮触发或监听系统主题变化事件,修改
force_dark的值后重新调用DwmSetWindowAttribute
方案二:自定义标题栏(完全可控)
隐藏系统默认标题栏,自行实现标题栏的UI和交互逻辑,这种方式可以完全定制样式,但需要额外实现窗口拖动、最小化/最大化/关闭等功能。
实现代码
import sys from PySide6.QtWidgets import ( QApplication, QMainWindow, QWidget, QHBoxLayout, QLabel, QPushButton, QSpacerItem, QSizePolicy ) from PySide6.QtCore import Qt, QPoint class CustomTitleBar(QWidget): def __init__(self, parent): super().__init__(parent) # 设置深色标题栏样式 self.setStyleSheet(""" QWidget { background-color: #2d2d2d; color: #ffffff; font-size: 14px; } QPushButton { background-color: transparent; border: none; padding: 5px 10px; color: #ffffff; } QPushButton:hover { background-color: #404040; } QPushButton:pressed { background-color: #505050; } """) layout = QHBoxLayout(self) layout.setContentsMargins(10, 5, 10, 5) layout.setSpacing(0) # 标题文本 layout.addWidget(QLabel("Custom Title Bar")) # 占位符,将按钮推到右侧 layout.addSpacerItem(QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)) # 窗口控制按钮 close_btn = QPushButton("×") close_btn.clicked.connect(parent.close) layout.addWidget(close_btn) # 窗口拖动相关变量 self.drag_pos = QPoint() def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.drag_pos = event.globalPosition().toPoint() - self.parent().frameGeometry().topLeft() event.accept() def mouseMoveEvent(self, event): if event.buttons() == Qt.LeftButton: self.parent().move(event.globalPosition().toPoint() - self.drag_pos) event.accept() class MainWindow(QMainWindow): def __init__(self): super().__init__() # 隐藏系统标题栏 self.setWindowFlag(Qt.FramelessWindowHint) self.resize(300, 200) # 设置自定义标题栏 self.setMenuWidget(CustomTitleBar(self)) # 主内容区域 central_widget = QWidget() central_widget.setStyleSheet("background-color: #1e1e1e;") self.setCentralWidget(central_widget) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
优缺点
- 优点:完全自定义样式,不受系统主题限制,跨平台可用
- 缺点:需要自行实现窗口拖动、最小化/最大化、窗口阴影等系统原生功能,开发工作量较大
内容的提问来源于stack exchange,提问作者Ecto Ruseff
相关产品推荐
相关产品推荐

