赞
踩
github
zhiyiYo/PyQt-Fluent-Widgets: A fluent design widgets library based on PyQt5 (github.com)
设计思路:
ConfigValidator 为基类,提供两个方法
validate(value) 验证 correct: 返回正确的值
子类:
RangeValidator 验证一个值是否在最大值,最小值之间
FolderValidator 文件验证
FolderListValidator 文件列表验证
ColorValidator Qcolor验证
设计思路, 基类ConfigSerializer 提供两个方法
序列化:serialize 反序列化deserialize
提供配置选项:
组 -> 名 -> 默认值 -> 选项值 -> 序列化 -> 是否重启应用程序
一个信号,值改变的时候发送信号值
默认初始化值:
self.file = Path("config/config.json")
self._theme = Theme.LIGHT
set(self, item, value, save=True): 设置配置
save=True 将调用
def save(self): 将配置保存到默认路径中
def load(self, file=None, config=None): 加载配置
样式管理器: qss文件路径 和 qwidget
数据结构:dict[qwidget] = qss
def register(self, file: str, widget: QWidget): 添加
def deregister(self, widget: QWidget): get
基类:
def path(self, theme=Theme.AUTO):
抽象方法,子类实现,qss文件路径
def content(self, theme=Theme.AUTO):
返回的qss样式 str类型
- def content(self, theme=Theme.AUTO):
- """ get the content of style sheet """
- return getStyleSheet(self, theme)
def apply(self, widget: QWidget, theme=Theme.AUTO):
设置主题样式
- def apply(self, widget: QWidget, theme=Theme.AUTO):
- """ apply style sheet to widget """
- setStyleSheet(widget, self, theme)
枚举类型中的属性 比如BUTTON 可以看出一个对象,它继承了StyleSheetBase的方法, self.value 就是枚举类型的值。
使用:
FluentStyleSheet.BUTTON.apply(self)
apply 调用了 widget.setStyleSheet(getStyleSheet(file, theme))
getStyleSheet(file, theme) file 便是当前枚举对象,调用了path方法。
path的具体实现如下。
- class FluentStyleSheet(StyleSheetBase, Enum):
- """ Fluent style sheet """
-
- MENU = "menu"
- BUTTON = "button"
- DIALOG = "dialog"
- SLIDER = "slider"
- INFO_BAR = "info_bar"
- SPIN_BOX = "spin_box"
- TOOL_TIP = "tool_tip"
- CHECK_BOX = "check_box"
- COMBO_BOX = "combo_box"
- LINE_EDIT = "line_edit"
- SETTING_CARD = "setting_card"
- COLOR_DIALOG = "color_dialog"
- SWITCH_BUTTON = "switch_button"
- MESSAGE_DIALOG = "message_dialog"
- STATE_TOOL_TIP = "state_tool_tip"
- FOLDER_LIST_DIALOG = "folder_list_dialog"
- SETTING_CARD_GROUP = "setting_card_group"
- EXPAND_SETTING_CARD = "expand_setting_card"
- NAVIGATION_INTERFACE = "navigation_interface"
-
- def path(self, theme=Theme.AUTO):
- theme = qconfig.theme if theme == Theme.AUTO else theme
- return f":/qfluentwidgets/qss/{theme.value.lower()}/{self.value}.qss"
qss文件。
非常好的一个设计思路。
用户只需要定义枚举类型(定义qss文件名),实现path(指明项目qss路径)。可以实现qss与代码的分离。
def path(self, theme=Theme.AUTO):
自定义svg图片路径名
def icon(self, theme=Theme.AUTO):
根据主题返回 icon
- def path(self, theme=Theme.AUTO):
- if theme == Theme.AUTO:
- c = getIconColor()
- else:
- c = "white" if theme == Theme.DARK else "black"
-
- return f':/qfluentwidgets/images/icons/{self.value}_{c}.svg'
初始化: svg qss样式
self._icon = icon
self.isPressed = False
FluentStyleSheet.BUTTON.apply(self)
def paintEvent(self, e): 事件
绘制的自动触发机制如下:
绘制的”手动“触发机制:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。