certflow.views.common.theme_manager module

主题管理器

提供应用级别的浅色/深色主题切换引擎。 通过 QApplication.setStyleSheet() 全局替换样式表实现即时切换, 无需重启应用。

架构层次:

Controller (SettingsController) → View/Common (ThemeManager) → QApplication

Usage:

manager = ThemeManager(app) manager.apply_theme("dark") # 切换到深色 manager.apply_theme("light") # 切换到浅色

class certflow.views.common.theme_manager.ThemeManager(app, parent=None)[源代码]

基类:QObject

主题管理器 — 浅色/深色主题切换

维护两套完整的 QSS (Qt Style Sheets),通过替换 application-level stylesheet 实现全局主题切换。

参数:
  • app (QApplication)

  • parent (QObject | None)

LIGHT_THEME = '\n    /* ===== 全局 ===== */\n    QMainWindow, QDialog, QWidget {\n        background-color: #f5f6fa;\n        color: #2c3e50;\n        font-family: "Microsoft YaHei", "SimHei", sans-serif;\n    }\n\n    /* ===== 导航栏 ===== */\n    QWidget#navBar {\n        background-color: #2c3e50;\n    }\n    QWidget#navBar QPushButton#navLogo {\n        background-color: transparent;\n        color: #ecf0f1;\n        border: none;\n        padding: 8px 16px;\n        font-weight: bold;\n        font-size: 16px;\n    }\n    QWidget#navBar QPushButton {\n        background-color: transparent;\n        color: #ecf0f1;\n        border: none;\n        padding: 8px 16px;\n        font-size: 14px;\n    }\n    QWidget#navBar QPushButton:hover {\n        background-color: #34495e;\n    }\n    QWidget#navBar QPushButton:checked {\n        background-color: #1abc9c;\n        color: white;\n    }\n    QWidget#navBar QPushButton#themeToggleBtn {\n        background-color: transparent;\n        color: #ecf0f1;\n        border: 1px solid #4a6278;\n        border-radius: 4px;\n        padding: 4px 12px;\n        font-size: 16px;\n    }\n    QWidget#navBar QPushButton#themeToggleBtn:hover {\n        background-color: #34495e;\n    }\n\n    /* ===== 主按钮 ===== */\n    QPushButton {\n        background-color: #2c7be5;\n        color: white;\n        border: none;\n        padding: 6px 16px;\n        border-radius: 4px;\n        font-size: 13px;\n    }\n    QPushButton:hover {\n        background-color: #1a68d1;\n    }\n    QPushButton:pressed {\n        background-color: #1557b0;\n    }\n    QPushButton:disabled {\n        background-color: #adb5bd;\n        color: #6c757d;\n    }\n\n    /* ===== 次要按钮 ===== */\n    QPushButton[secondary="true"] {\n        background-color: #6c757d;\n        color: white;\n    }\n    QPushButton[secondary="true"]:hover {\n        background-color: #5a6268;\n    }\n\n    /* ===== 成功按钮 ===== */\n    QPushButton[success="true"] {\n        background-color: #28a745;\n        color: white;\n    }\n    QPushButton[success="true"]:hover {\n        background-color: #218838;\n    }\n\n    /* ===== 输入框 ===== */\n    QLineEdit, QSpinBox, QDoubleSpinBox, QComboBox, QDateEdit {\n        background-color: white;\n        color: #2c3e50;\n        border: 1px solid #ced4da;\n        border-radius: 4px;\n        padding: 4px 8px;\n        font-size: 13px;\n    }\n    QLineEdit:focus, QSpinBox:focus, QDoubleSpinBox:focus, QComboBox:focus {\n        border-color: #2c7be5;\n    }\n    QComboBox::drop-down {\n        border: none;\n        padding-right: 8px;\n    }\n    QComboBox QAbstractItemView {\n        background-color: white;\n        color: #2c3e50;\n        selection-background-color: #2c7be5;\n        selection-color: white;\n    }\n\n    /* ===== 表格 ===== */\n    QTableWidget, QTableView {\n        background-color: white;\n        alternate-background-color: #f8f9fa;\n        color: #2c3e50;\n        gridline-color: #dee2e6;\n        border: 1px solid #dee2e6;\n        font-size: 13px;\n        selection-background-color: #cce5ff;\n        selection-color: #2c3e50;\n    }\n    QHeaderView::section {\n        background-color: #e9ecef;\n        color: #495057;\n        padding: 6px;\n        border: 1px solid #dee2e6;\n        font-weight: bold;\n    }\n\n    /* ===== 分组框 ===== */\n    QGroupBox {\n        border: 1px solid #dee2e6;\n        border-radius: 6px;\n        margin-top: 8px;\n        padding-top: 16px;\n        font-weight: bold;\n        color: #495057;\n    }\n    QGroupBox::title {\n        subcontrol-origin: margin;\n        left: 12px;\n        padding: 0 6px;\n    }\n\n    /* ===== 标签页 ===== */\n    QTabWidget::pane {\n        border: 1px solid #dee2e6;\n        background-color: white;\n    }\n    QTabBar::tab {\n        background-color: #e9ecef;\n        color: #495057;\n        padding: 8px 20px;\n        border: 1px solid #dee2e6;\n        border-bottom: none;\n        border-top-left-radius: 4px;\n        border-top-right-radius: 4px;\n    }\n    QTabBar::tab:selected {\n        background-color: white;\n        color: #2c7be5;\n        font-weight: bold;\n    }\n    QTabBar::tab:hover:!selected {\n        background-color: #dee2e6;\n    }\n\n    /* ===== 滚动条 ===== */\n    QScrollBar:vertical {\n        background: #f5f6fa;\n        width: 10px;\n        border-radius: 5px;\n    }\n    QScrollBar::handle:vertical {\n        background: #ced4da;\n        border-radius: 5px;\n        min-height: 20px;\n    }\n    QScrollBar::handle:vertical:hover {\n        background: #adb5bd;\n    }\n    QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {\n        height: 0;\n    }\n\n    /* ===== 复选框/单选框 ===== */\n    QCheckBox, QRadioButton {\n        color: #2c3e50;\n        spacing: 6px;\n    }\n    QCheckBox::indicator {\n        width: 16px;\n        height: 16px;\n    }\n\n    /* ===== 标签 ===== */\n    QLabel {\n        color: #2c3e50;\n    }\n\n    /* ===== 进度条 ===== */\n    QProgressBar {\n        background-color: #e9ecef;\n        border: none;\n        border-radius: 4px;\n        height: 8px;\n        text-align: center;\n    }\n    QProgressBar::chunk {\n        background-color: #2c7be5;\n        border-radius: 4px;\n    }\n\n    /* ===== 树形控件 ===== */\n    QTreeWidget {\n        background-color: white;\n        alternate-background-color: #f8f9fa;\n        color: #2c3e50;\n        border: 1px solid #dee2e6;\n    }\n    QTreeWidget::item:selected {\n        background-color: #cce5ff;\n        color: #2c3e50;\n    }\n\n    /* ===== 状态栏 ===== */\n    QStatusBar {\n        background-color: #e9ecef;\n        color: #6c757d;\n    }\n    '
DARK_THEME = '\n    /* ===== 全局 ===== */\n    QMainWindow, QDialog, QWidget {\n        background-color: #1e1e2e;\n        color: #cdd6f4;\n        font-family: "Microsoft YaHei", "SimHei", sans-serif;\n    }\n\n    /* ===== 导航栏 ===== */\n    QWidget#navBar {\n        background-color: #11111b;\n    }\n    QWidget#navBar QPushButton#navLogo {\n        background-color: transparent;\n        color: #bac2de;\n        border: none;\n        padding: 8px 16px;\n        font-weight: bold;\n        font-size: 16px;\n    }\n    QWidget#navBar QPushButton {\n        background-color: transparent;\n        color: #bac2de;\n        border: none;\n        padding: 8px 16px;\n        font-size: 14px;\n    }\n    QWidget#navBar QPushButton:hover {\n        background-color: #313244;\n    }\n    QWidget#navBar QPushButton:checked {\n        background-color: #89b4fa;\n        color: #1e1e2e;\n    }\n    QWidget#navBar QPushButton#themeToggleBtn {\n        background-color: transparent;\n        color: #bac2de;\n        border: 1px solid #45475a;\n        border-radius: 4px;\n        padding: 4px 12px;\n        font-size: 16px;\n    }\n    QWidget#navBar QPushButton#themeToggleBtn:hover {\n        background-color: #313244;\n    }\n\n    /* ===== 主按钮 ===== */\n    QPushButton {\n        background-color: #89b4fa;\n        color: #1e1e2e;\n        border: none;\n        padding: 6px 16px;\n        border-radius: 4px;\n        font-size: 13px;\n    }\n    QPushButton:hover {\n        background-color: #74a8f7;\n    }\n    QPushButton:pressed {\n        background-color: #5e9cf5;\n    }\n    QPushButton:disabled {\n        background-color: #45475a;\n        color: #6c7086;\n    }\n\n    /* ===== 次要按钮 ===== */\n    QPushButton[secondary="true"] {\n        background-color: #585b70;\n        color: #cdd6f4;\n    }\n    QPushButton[secondary="true"]:hover {\n        background-color: #6c7086;\n    }\n\n    /* ===== 成功按钮 ===== */\n    QPushButton[success="true"] {\n        background-color: #a6e3a1;\n        color: #1e1e2e;\n    }\n    QPushButton[success="true"]:hover {\n        background-color: #94e2d5;\n    }\n\n    /* ===== 输入框 ===== */\n    QLineEdit, QSpinBox, QDoubleSpinBox, QComboBox, QDateEdit {\n        background-color: #313244;\n        color: #cdd6f4;\n        border: 1px solid #45475a;\n        border-radius: 4px;\n        padding: 4px 8px;\n        font-size: 13px;\n    }\n    QLineEdit:focus, QSpinBox:focus, QDoubleSpinBox:focus, QComboBox:focus {\n        border-color: #89b4fa;\n    }\n    QComboBox::drop-down {\n        border: none;\n        padding-right: 8px;\n    }\n    QComboBox QAbstractItemView {\n        background-color: #313244;\n        color: #cdd6f4;\n        selection-background-color: #89b4fa;\n        selection-color: #1e1e2e;\n    }\n\n    /* ===== 表格 ===== */\n    QTableWidget, QTableView {\n        background-color: #1e1e2e;\n        alternate-background-color: #313244;\n        color: #cdd6f4;\n        gridline-color: #45475a;\n        border: 1px solid #45475a;\n        font-size: 13px;\n        selection-background-color: #45475a;\n        selection-color: #cdd6f4;\n    }\n    QHeaderView::section {\n        background-color: #313244;\n        color: #bac2de;\n        padding: 6px;\n        border: 1px solid #45475a;\n        font-weight: bold;\n    }\n\n    /* ===== 分组框 ===== */\n    QGroupBox {\n        border: 1px solid #45475a;\n        border-radius: 6px;\n        margin-top: 8px;\n        padding-top: 16px;\n        font-weight: bold;\n        color: #bac2de;\n    }\n    QGroupBox::title {\n        subcontrol-origin: margin;\n        left: 12px;\n        padding: 0 6px;\n    }\n\n    /* ===== 标签页 ===== */\n    QTabWidget::pane {\n        border: 1px solid #45475a;\n        background-color: #1e1e2e;\n    }\n    QTabBar::tab {\n        background-color: #313244;\n        color: #6c7086;\n        padding: 8px 20px;\n        border: 1px solid #45475a;\n        border-bottom: none;\n        border-top-left-radius: 4px;\n        border-top-right-radius: 4px;\n    }\n    QTabBar::tab:selected {\n        background-color: #1e1e2e;\n        color: #89b4fa;\n        font-weight: bold;\n    }\n    QTabBar::tab:hover:!selected {\n        background-color: #45475a;\n    }\n\n    /* ===== 滚动条 ===== */\n    QScrollBar:vertical {\n        background: #1e1e2e;\n        width: 10px;\n        border-radius: 5px;\n    }\n    QScrollBar::handle:vertical {\n        background: #45475a;\n        border-radius: 5px;\n        min-height: 20px;\n    }\n    QScrollBar::handle:vertical:hover {\n        background: #585b70;\n    }\n    QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {\n        height: 0;\n    }\n\n    /* ===== 复选框/单选框 ===== */\n    QCheckBox, QRadioButton {\n        color: #cdd6f4;\n        spacing: 6px;\n    }\n    QCheckBox::indicator {\n        width: 16px;\n        height: 16px;\n    }\n\n    /* ===== 标签 ===== */\n    QLabel {\n        color: #cdd6f4;\n    }\n\n    /* ===== 进度条 ===== */\n    QProgressBar {\n        background-color: #313244;\n        border: none;\n        border-radius: 4px;\n        height: 8px;\n        text-align: center;\n    }\n    QProgressBar::chunk {\n        background-color: #89b4fa;\n        border-radius: 4px;\n    }\n\n    /* ===== 树形控件 ===== */\n    QTreeWidget {\n        background-color: #1e1e2e;\n        alternate-background-color: #313244;\n        color: #cdd6f4;\n        border: 1px solid #45475a;\n    }\n    QTreeWidget::item:selected {\n        background-color: #45475a;\n        color: #cdd6f4;\n    }\n\n    /* ===== 状态栏 ===== */\n    QStatusBar {\n        background-color: #313244;\n        color: #6c7086;\n    }\n    '
property current_theme: str

当前主题名称

apply_theme(theme)[源代码]

应用指定主题

参数:

theme (str) -- 主题名称,可选 "light" 或 "dark"

返回:

切换成功时更新 _current_theme 并替换全局样式表

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("ThemeManager" inherits "QObject": )