#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (c) 2025 Any2MIF Project # All rights reserved. """ Any2MIF - 主题控制器 负责应用程序的主题设置,锁定为深色模式 """ import os from PyQt6.QtWidgets import QWidget from PyQt6.QtCore import QSettings, pyqtSignal class ThemeController(QWidget): """主题控制器,锁定为深色模式""" # 自定义信号 theme_changed = pyqtSignal(str) # 主题变更时发出的信号 def __init__(self, settings: QSettings, parent=None): """初始化主题控制器""" super().__init__(parent) self.settings = settings # 直接设置为深色模式 self.settings.setValue("theme", "dark") self.apply_theme("dark") self.theme_changed.emit("dark") def apply_theme(self, theme): """应用主题""" # 加载样式表 style_file = os.path.join("resources", "styles", f"{theme}.qss") if os.path.exists(style_file): with open(style_file, "r", encoding="utf-8") as f: style_sheet = f.read() # 应用样式表到应用程序 app = self.window().parent() if app: app.setStyleSheet(style_sheet) else: # 如果样式文件不存在,使用默认样式 self._apply_default_style(theme) def _apply_default_style(self, theme): """应用默认样式""" if theme == "light": style_sheet = """ QMainWindow, QDialog { background-color: #f5f5f5; color: #333333; } QWidget { background-color: #f5f5f5; color: #333333; } QLabel { color: #333333; } QPushButton { background-color: #e0e0e0; border: 1px solid #b0b0b0; border-radius: 4px; padding: 5px 10px; color: #333333; } QPushButton:hover { background-color: #d0d0d0; } QPushButton:pressed { background-color: #c0c0c0; } QLineEdit, QSpinBox, QComboBox { background-color: #ffffff; border: 1px solid #b0b0b0; border-radius: 4px; padding: 3px; color: #333333; } QGroupBox { border: 1px solid #b0b0b0; border-radius: 4px; margin-top: 10px; padding-top: 10px; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top center; padding: 0 5px; color: #333333; } QListWidget { background-color: #ffffff; border: 1px solid #b0b0b0; border-radius: 4px; color: #333333; } QListWidget::item:selected { background-color: #b0b0b0; color: #333333; } QSlider::groove:horizontal { border: 1px solid #b0b0b0; height: 8px; background: #ffffff; margin: 2px 0; border-radius: 4px; } QSlider::handle:horizontal { background: #e0e0e0; border: 1px solid #b0b0b0; width: 18px; margin: -2px 0; border-radius: 9px; } QSlider::handle:horizontal:hover { background: #d0d0d0; } QStatusBar { background-color: #e0e0e0; color: #333333; } QToolBar { background-color: #e0e0e0; border-bottom: 1px solid #b0b0b0; } """ else: # dark style_sheet = """ QMainWindow, QDialog { background-color: #2d2d2d; color: #f0f0f0; } QWidget { background-color: #2d2d2d; color: #f0f0f0; } QLabel { color: #f0f0f0; } QPushButton { background-color: #3d3d3d; border: 1px solid #5d5d5d; border-radius: 4px; padding: 5px 10px; color: #f0f0f0; } QPushButton:hover { background-color: #4d4d4d; } QPushButton:pressed { background-color: #5d5d5d; } QLineEdit, QSpinBox, QComboBox { background-color: #3d3d3d; border: 1px solid #5d5d5d; border-radius: 4px; padding: 3px; color: #f0f0f0; } QGroupBox { border: 1px solid #5d5d5d; border-radius: 4px; margin-top: 10px; padding-top: 10px; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top center; padding: 0 5px; color: #f0f0f0; } QListWidget { background-color: #3d3d3d; border: 1px solid #5d5d5d; border-radius: 4px; color: #f0f0f0; } QListWidget::item:selected { background-color: #5d5d5d; color: #f0f0f0; } QSlider::groove:horizontal { border: 1px solid #5d5d5d; height: 8px; background: #3d3d3d; margin: 2px 0; border-radius: 4px; } QSlider::handle:horizontal { background: #5d5d5d; border: 1px solid #7d7d7d; width: 18px; margin: -2px 0; border-radius: 9px; } QSlider::handle:horizontal:hover { background: #6d6d6d; } QStatusBar { background-color: #3d3d3d; color: #f0f0f0; } QToolBar { background-color: #3d3d3d; border-bottom: 1px solid #5d5d5d; } """ # 应用样式表到应用程序 app = self.window().parent() if app: app.setStyleSheet(style_sheet)