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): 事件
绘制的自动触发机制如下:
绘制的”手动“触发机制: