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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:33:25