#!/usr/bin/env python # -*- coding: utf-8 -*- """ 现代化样式表和主题管理模块 Modern Stylesheet and Theme Management Module """ class ModernStylesheet: """现代化样式表集合""" # 颜色定义 COLORS = { 'main_bg': '#F0F0F0', # 主窗口背景:浅灰 'panel_bg': '#FFFFFF', # 面板/容器背景:白色 'text_primary': '#000000', # 主文字:黑色 'text_secondary': '#666666', # 辅助文字:灰色 'border': '#D0D0D0', # 边框:浅灰 'border_light': '#E8E8E8', # 浅边框 'accent': '#007BFF', # 强调色:蓝色 'success': '#28A745', # 成功绿 'error': '#DC3545', # 错误红 'warning': '#FFC107', # 警告黄 'hover': '#E8E8E8', # 悬停背景 'selected': '#0056B3', # 选中色 } @staticmethod def get_main_stylesheet(): """获取主样式表""" return f""" /* 主窗口 */ QMainWindow {{ background-color: {ModernStylesheet.COLORS['main_bg']}; }} /* 中央部件和容器 */ QWidget {{ background-color: {ModernStylesheet.COLORS['main_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; }} /* 分组框 */ QGroupBox {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; font-weight: bold; border: 0px; margin-top: 10px; padding-top: 15px; padding-left: 9px; padding-right: 9px; padding-bottom: 9px; border-bottom: 1px solid {ModernStylesheet.COLORS['border_light']}; }} QGroupBox::title {{ subcontrol-origin: margin; subcontrol-position: top left; padding: 0 5px; font-size: 12px; font-weight: bold; color: {ModernStylesheet.COLORS['text_primary']}; }} /* 按钮 */ QPushButton {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; border: 1px solid {ModernStylesheet.COLORS['border']}; border-radius: 7px; padding: 3px 5px; min-height: 25px; max-height: 33px; font-size: 12px; font-weight: normal; outline: none; }} QPushButton:hover {{ background-color: {ModernStylesheet.COLORS['hover']}; border: 1px solid {ModernStylesheet.COLORS['border']}; }} QPushButton:pressed {{ background-color: {ModernStylesheet.COLORS['border_light']}; }} QPushButton:disabled {{ background-color: {ModernStylesheet.COLORS['hover']}; color: {ModernStylesheet.COLORS['text_secondary']}; border: 1px solid {ModernStylesheet.COLORS['border_light']}; }} QPushButton:focus {{ outline: none; }} /* 输入框 */ QLineEdit {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; border: 1px solid {ModernStylesheet.COLORS['border']}; border-radius: 10px; padding: 5px 8px; min-height: 20px; selection-background-color: {ModernStylesheet.COLORS['selected']}; selection-color: white; }} QLineEdit:focus {{ border: 1px solid {ModernStylesheet.COLORS['accent']}; background-color: {ModernStylesheet.COLORS['panel_bg']}; }} /* 下拉框 */ QComboBox {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; border: 1px solid {ModernStylesheet.COLORS['border']}; border-radius: 5px; padding: 5px 8px; min-height: 25px; selection-background-color: {ModernStylesheet.COLORS['selected']}; }} QComboBox:focus {{ border: 1px solid {ModernStylesheet.COLORS['accent']}; }} QComboBox::drop-down {{ border: 0px; padding-right: 5px; }} QComboBox QAbstractItemView {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; selection-background-color: {ModernStylesheet.COLORS['selected']}; selection-color: white; border: 1px solid {ModernStylesheet.COLORS['border']}; }} /* 数值输入框 */ QSpinBox, QDoubleSpinBox {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; border: 1px solid {ModernStylesheet.COLORS['border']}; border-radius: 5px; padding: 5px 8px; min-height: 25px; }} QSpinBox:focus, QDoubleSpinBox:focus {{ border: 1px solid {ModernStylesheet.COLORS['accent']}; }} QSpinBox::up-button, QDoubleSpinBox::up-button {{ border: 0px; padding-right: 5px; }} QSpinBox::down-button, QDoubleSpinBox::down-button {{ border: 0px; padding-right: 5px; }} /* 复选框 */ QCheckBox {{ color: {ModernStylesheet.COLORS['text_primary']}; spacing: 5px; }} QCheckBox::indicator {{ width: 16px; height: 16px; border: 1px solid {ModernStylesheet.COLORS['border']}; border-radius: 3px; background-color: {ModernStylesheet.COLORS['panel_bg']}; }} QCheckBox::indicator:checked {{ background-color: {ModernStylesheet.COLORS['accent']}; border: 1px solid {ModernStylesheet.COLORS['accent']}; }} /* 单选框 */ QRadioButton {{ color: {ModernStylesheet.COLORS['text_primary']}; spacing: 5px; }} QRadioButton::indicator {{ width: 16px; height: 16px; border: 1px solid {ModernStylesheet.COLORS['border']}; border-radius: 8px; background-color: {ModernStylesheet.COLORS['panel_bg']}; }} QRadioButton::indicator:checked {{ background: qradial(circle, {ModernStylesheet.COLORS['accent']} 0%, {ModernStylesheet.COLORS['accent']} 40%, {ModernStylesheet.COLORS['panel_bg']} 60%); border: 1px solid {ModernStylesheet.COLORS['accent']}; }} /* 文本编辑框 */ QTextEdit {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; border: 1px solid {ModernStylesheet.COLORS['border']}; border-radius: 5px; padding: 5px; selection-background-color: {ModernStylesheet.COLORS['selected']}; selection-color: white; }} QTextEdit:focus {{ border: 1px solid {ModernStylesheet.COLORS['accent']}; }} /* 列表部件 */ QListWidget {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; border: 1px solid {ModernStylesheet.COLORS['border']}; border-radius: 5px; outline: none; }} QListWidget::item {{ padding: 6px; border: 0px; }} QListWidget::item:hover {{ background-color: {ModernStylesheet.COLORS['hover']}; }} QListWidget::item:selected {{ background-color: {ModernStylesheet.COLORS['selected']}; color: white; }} /* 滚动区域 */ QScrollArea {{ background-color: {ModernStylesheet.COLORS['main_bg']}; border: 0px; }} /* 滚动条 */ QScrollBar:vertical {{ background-color: {ModernStylesheet.COLORS['main_bg']}; width: 12px; border: 0px; }} QScrollBar::handle:vertical {{ background-color: {ModernStylesheet.COLORS['border']}; border-radius: 6px; min-height: 20px; }} QScrollBar::handle:vertical:hover {{ background-color: {ModernStylesheet.COLORS['text_secondary']}; }} QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {{ border: 0px; background-color: transparent; }} QScrollBar:horizontal {{ background-color: {ModernStylesheet.COLORS['main_bg']}; height: 12px; border: 0px; }} QScrollBar::handle:horizontal {{ background-color: {ModernStylesheet.COLORS['border']}; border-radius: 6px; min-width: 20px; }} QScrollBar::handle:horizontal:hover {{ background-color: {ModernStylesheet.COLORS['text_secondary']}; }} QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal {{ border: 0px; background-color: transparent; }} /* 进度条 */ QProgressBar {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; border: 1px solid {ModernStylesheet.COLORS['border']}; border-radius: 5px; padding: 2px; text-align: center; height: 20px; }} QProgressBar::chunk {{ background-color: {ModernStylesheet.COLORS['success']}; border-radius: 3px; }} /* 标签 */ QLabel {{ color: {ModernStylesheet.COLORS['text_primary']}; background-color: transparent; }} /* 标签栏 */ QTabBar::tab {{ background-color: {ModernStylesheet.COLORS['main_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; border: 1px solid {ModernStylesheet.COLORS['border']}; border-bottom: 0px; padding: 8px 12px; margin-right: 2px; border-radius: 5px 5px 0px 0px; }} QTabBar::tab:selected {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; border: 1px solid {ModernStylesheet.COLORS['border']}; border-bottom: 2px solid {ModernStylesheet.COLORS['accent']}; color: {ModernStylesheet.COLORS['accent']}; }} QTabBar::tab:hover {{ background-color: {ModernStylesheet.COLORS['hover']}; }} QTabWidget::pane {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; border: 1px solid {ModernStylesheet.COLORS['border']}; border-top: 0px; border-radius: 0px 0px 5px 5px; }} /* 菜单栏 */ QMenuBar {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; border-bottom: 1px solid {ModernStylesheet.COLORS['border_light']}; padding: 2px; }} QMenuBar::item:selected {{ background-color: {ModernStylesheet.COLORS['hover']}; }} /* 菜单 */ QMenu {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; border: 1px solid {ModernStylesheet.COLORS['border']}; padding: 4px 0px; border-radius: 5px; }} QMenu::item:selected {{ background-color: {ModernStylesheet.COLORS['hover']}; padding-left: 20px; }} QMenu::separator {{ height: 1px; background-color: {ModernStylesheet.COLORS['border_light']}; margin: 4px 0px; }} /* 状态栏 */ QStatusBar {{ background-color: {ModernStylesheet.COLORS['panel_bg']}; color: {ModernStylesheet.COLORS['text_primary']}; border-top: 1px solid {ModernStylesheet.COLORS['border_light']}; }} /* 框架 */ QFrame {{ background-color: {ModernStylesheet.COLORS['main_bg']}; border: 0px; }} /* 对话框 */ QDialog {{ background-color: {ModernStylesheet.COLORS['main_bg']}; }} /* 消息框 */ QMessageBox {{ background-color: {ModernStylesheet.COLORS['main_bg']}; }} QMessageBox QLabel {{ color: {ModernStylesheet.COLORS['text_primary']}; }} """ @staticmethod def get_button_stylesheet(style_type='normal'): """获取特定样式的按钮样式表""" colors = ModernStylesheet.COLORS if style_type == 'primary': # 蓝色主按钮 return f""" QPushButton {{ background-color: {colors['accent']}; color: white; border: 1px solid {colors['accent']}; border-radius: 7px; padding: 3px 5px; min-height: 25px; max-height: 33px; font-weight: bold; }} QPushButton:hover {{ background-color: #0056b3; border: 1px solid #0056b3; }} QPushButton:pressed {{ background-color: #003d82; }} QPushButton:disabled {{ background-color: {colors['hover']}; color: {colors['text_secondary']}; border: 1px solid {colors['border_light']}; }} """ elif style_type == 'success': # 绿色成功按钮 return f""" QPushButton {{ background-color: {colors['success']}; color: white; border: 1px solid {colors['success']}; border-radius: 7px; padding: 3px 5px; min-height: 25px; max-height: 33px; font-weight: bold; }} QPushButton:hover {{ background-color: #218838; border: 1px solid #218838; }} QPushButton:pressed {{ background-color: #1a6c28; }} QPushButton:disabled {{ background-color: {colors['hover']}; color: {colors['text_secondary']}; border: 1px solid {colors['border_light']}; }} """ elif style_type == 'danger': # 红色危险按钮 return f""" QPushButton {{ background-color: {colors['error']}; color: white; border: 1px solid {colors['error']}; border-radius: 7px; padding: 3px 5px; min-height: 25px; max-height: 33px; font-weight: bold; }} QPushButton:hover {{ background-color: #c82333; border: 1px solid #c82333; }} QPushButton:pressed {{ background-color: #9a1a24; }} QPushButton:disabled {{ background-color: {colors['hover']}; color: {colors['text_secondary']}; border: 1px solid {colors['border_light']}; }} """ else: # normal/default return f""" QPushButton {{ background-color: {colors['panel_bg']}; color: {colors['text_primary']}; border: 1px solid {colors['border']}; border-radius: 7px; padding: 3px 5px; min-height: 25px; max-height: 33px; }} QPushButton:hover {{ background-color: {colors['hover']}; border: 1px solid {colors['border']}; }} QPushButton:pressed {{ background-color: {colors['border_light']}; }} QPushButton:disabled {{ background-color: {colors['hover']}; color: {colors['text_secondary']}; border: 1px solid {colors['border_light']}; }} """ @staticmethod def get_toolbar_stylesheet(): """获取顶部工具栏样式表""" colors = ModernStylesheet.COLORS return f""" QWidget {{ background-color: {colors['panel_bg']}; border-bottom: 1px solid {colors['border_light']}; }} QLabel {{ color: {colors['text_primary']}; }} QPushButton {{ background-color: {colors['panel_bg']}; color: {colors['text_primary']}; border: 1px solid {colors['border']}; border-radius: 5px; padding: 5px 10px; min-height: 25px; }} QPushButton:hover {{ background-color: {colors['hover']}; }} """ @staticmethod def get_sidebar_stylesheet(): """获取左侧边栏样式表""" colors = ModernStylesheet.COLORS return f""" QWidget {{ background-color: {colors['panel_bg']}; border-right: 1px solid {colors['border_light']}; }} QLabel {{ color: {colors['text_primary']}; font-weight: bold; }} QListWidget {{ background-color: {colors['panel_bg']}; border: 0px; border-right: 1px solid {colors['border_light']}; }} QListWidget::item {{ padding: 8px; border-left: 3px solid transparent; }} QListWidget::item:hover {{ background-color: {colors['hover']}; }} QListWidget::item:selected {{ background-color: transparent; color: {colors['accent']}; border-left: 3px solid {colors['accent']}; font-weight: bold; }} """