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 '¶
- apply_theme(theme)[源代码]¶
应用指定主题
- 参数:
theme (str) -- 主题名称,可选 "light" 或 "dark"
- 返回:
切换成功时更新 _current_theme 并替换全局样式表
- 返回类型:
None
- staticMetaObject = PySide6.QtCore.QMetaObject("ThemeManager" inherits "QObject": )¶