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

PyQt默认明暗模式调色板如何获取?实现动态切换功能

用PyQt自带组件实现明暗模式动态切换

不用第三方主题库,完全依靠PyQt内置的调色板和系统主题机制就能实现需求,以下分版本给出解决方案:

一、PyQt6 最简实现

PyQt6直接提供了系统主题切换的API,无需手动处理调色板:

from PyQt6.QtGui import QGuiApplication
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

app = QApplication([])

def toggle_dark_light():
    current_theme = QGuiApplication.desktopTheme()
    # 切换到对应主题,系统自动同步调色板和样式
    QGuiApplication.setDesktopTheme("dark" if current_theme == "light" else "light")

# 测试用UI
window = QWidget()
layout = QVBoxLayout()
toggle_btn = QPushButton("切换明暗模式")
toggle_btn.clicked.connect(toggle_dark_light)
layout.addWidget(toggle_btn)
window.setLayout(layout)
window.show()

app.exec()

调用QGuiApplication.setDesktopTheme()后,PyQt会自动应用系统对应的明暗调色板,完全复用原生样式。

二、PyQt5 实现方案

PyQt5没有直接的主题切换API,需要通过调色板或系统交互来实现:

1. 跟随系统主题自动切换

PyQt5.12+默认已经支持跟随系统明暗模式,只要你没有手动修改过全局调色板或样式表。如果之前自定义过样式,想要恢复原生跟随行为,执行:

app.setPalette(app.style().standardPalette())
app.setStyleSheet("")  # 清除自定义样式表,避免覆盖调色板效果

2. 手动切换明暗调色板

如果要脱离系统设置手动切换,可以预先获取系统明暗模式下的调色板并保存,之后直接切换使用:

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
from PyQt5.QtGui import QPalette

app = QApplication([])

# 预先获取明暗调色板(可以在程序启动时,临时切换系统主题后分别保存)
light_palette = app.palette()
# 示例:模拟深色调色板(更准确的方式是实际切换系统深色模式后获取)
dark_palette = QPalette()
dark_palette.setColor(QPalette.Window, QPalette.Color(53, 53, 53))
dark_palette.setColor(QPalette.WindowText, QPalette.Color(255, 255, 255))
dark_palette.setColor(QPalette.Base, QPalette.Color(25, 25, 25))
dark_palette.setColor(QPalette.AlternateBase, QPalette.Color(53, 53, 53))
dark_palette.setColor(QPalette.ToolTipBase, QPalette.Color(255, 255, 255))
dark_palette.setColor(QPalette.ToolTipText, QPalette.Color(255, 255, 255))
dark_palette.setColor(QPalette.Text, QPalette.Color(255, 255, 255))
dark_palette.setColor(QPalette.Button, QPalette.Color(53, 53, 53))
dark_palette.setColor(QPalette.ButtonText, QPalette.Color(255, 255, 255))
dark_palette.setColor(QPalette.BrightText, QPalette.Color(255, 0, 0))
dark_palette.setColor(QPalette.Link, QPalette.Color(42, 130, 218))
dark_palette.setColor(QPalette.Highlight, QPalette.Color(42, 130, 218))
dark_palette.setColor(QPalette.HighlightedText, QPalette.Color(0, 0, 0))

def toggle_theme():
    current_palette = app.palette()
    if current_palette == light_palette:
        app.setPalette(dark_palette)
    else:
        app.setPalette(light_palette)

# 测试UI
window = QWidget()
layout = QVBoxLayout()
toggle_btn = QPushButton("切换明暗模式")
toggle_btn.clicked.connect(toggle_theme)
layout.addWidget(toggle_btn)
window.setLayout(layout)
window.show()

app.exec_()

也可以在macOS上通过调用AppleScript切换系统主题,再让PyQt刷新调色板,这种方式能完全复用系统原生的深色调色板:

import subprocess
from PyQt5.QtWidgets import QApplication

def toggle_system_theme():
    # macOS下切换系统明暗主题
    subprocess.run(["osascript", "-e", 'tell application "System Events" to tell appearance preferences to set dark mode to not dark mode'])
    # 刷新应用调色板
    app.setPalette(app.style().standardPalette())

关键注意事项

  • 不要混用自定义样式表和原生调色板:样式表会覆盖调色板的颜色设置,若要使用原生明暗模式,需清除自定义样式表。
  • Fusion样式在PyQt5.15+支持明暗跟随:如果使用app.setStyle(QStyleFactory.create("Fusion")),系统切换明暗时Fusion会自动适配对应的调色板。

内容的提问来源于stack exchange,提问作者Ray Osborn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:16:15