当前位置:   article > 正文

pyqt 开源项目源码阅读_pyqt-fluent-widgets

pyqt-fluent-widgets

简介:

github

zhiyiYo/PyQt-Fluent-Widgets: A fluent design widgets library based on PyQt5 (github.com)

config模块:

ConfigValidator验证模块:

设计思路:

ConfigValidator 为基类,提供两个方法

validate(value) 验证 correct: 返回正确的值

子类:

RangeValidator 验证一个值是否在最大值,最小值之间

FolderValidator 文件验证

FolderListValidator 文件列表验证

ColorValidator  Qcolor验证

ConfigSerializer 序列化模块

设计思路, 基类ConfigSerializer 提供两个方法

序列化:serialize  反序列化deserialize

ConfigItem

提供配置选项:

组 -> 名 -> 默认值 -> 选项值  -> 序列化 -> 是否重启应用程序

一个信号,值改变的时候发送信号值

QConfig

默认初始化值:

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): 加载配置

style_sheet 模块:

StyleSheetManager:

样式管理器: qss文件路径 和 qwidget

数据结构:dict[qwidget] = qss

def register(self, file: str, widget: QWidget): 添加

def deregister(self, widget: QWidget):  get

StyleSheetBase

基类:

def path(self, theme=Theme.AUTO):

抽象方法,子类实现,qss文件路径

def content(self, theme=Theme.AUTO):

 返回的qss样式 str类型

  1. def content(self, theme=Theme.AUTO):
  2. """ get the content of style sheet """
  3. return getStyleSheet(self, theme)

def apply(self, widget: QWidget, theme=Theme.AUTO):

设置主题样式

  1. def apply(self, widget: QWidget, theme=Theme.AUTO):
  2. """ apply style sheet to widget """
  3. setStyleSheet(widget, self, theme)

 class FluentStyleSheet(StyleSheetBase, Enum):

枚举类型中的属性 比如BUTTON 可以看出一个对象,它继承了StyleSheetBase的方法, self.value 就是枚举类型的值。

使用:

FluentStyleSheet.BUTTON.apply(self)

apply 调用了 widget.setStyleSheet(getStyleSheet(file, theme))

getStyleSheet(file, theme)  file 便是当前枚举对象,调用了path方法。

path的具体实现如下。

  1. class FluentStyleSheet(StyleSheetBase, Enum):
  2. """ Fluent style sheet """
  3. MENU = "menu"
  4. BUTTON = "button"
  5. DIALOG = "dialog"
  6. SLIDER = "slider"
  7. INFO_BAR = "info_bar"
  8. SPIN_BOX = "spin_box"
  9. TOOL_TIP = "tool_tip"
  10. CHECK_BOX = "check_box"
  11. COMBO_BOX = "combo_box"
  12. LINE_EDIT = "line_edit"
  13. SETTING_CARD = "setting_card"
  14. COLOR_DIALOG = "color_dialog"
  15. SWITCH_BUTTON = "switch_button"
  16. MESSAGE_DIALOG = "message_dialog"
  17. STATE_TOOL_TIP = "state_tool_tip"
  18. FOLDER_LIST_DIALOG = "folder_list_dialog"
  19. SETTING_CARD_GROUP = "setting_card_group"
  20. EXPAND_SETTING_CARD = "expand_setting_card"
  21. NAVIGATION_INTERFACE = "navigation_interface"
  22. def path(self, theme=Theme.AUTO):
  23. theme = qconfig.theme if theme == Theme.AUTO else theme
  24. return f":/qfluentwidgets/qss/{theme.value.lower()}/{self.value}.qss"

qss文件。 

小结: 

非常好的一个设计思路。

用户只需要定义枚举类型(定义qss文件名),实现path(指明项目qss路径)。可以实现qss与代码的分离。

icon模块

FluentIconBase

def path(self, theme=Theme.AUTO):

自定义svg图片路径名

def icon(self, theme=Theme.AUTO):

根据主题返回 icon

class FluentIcon(FluentIconBase, Enum):

  1. def path(self, theme=Theme.AUTO):
  2. if theme == Theme.AUTO:
  3. c = getIconColor()
  4. else:
  5. c = "white" if theme == Theme.DARK else "black"
  6. return f':/qfluentwidgets/images/icons/{self.value}_{c}.svg'

 

BUtton模块

class ToolButton(QToolButton):

 初始化: svg  qss样式

        self._icon = icon
        self.isPressed = False
        FluentStyleSheet.BUTTON.apply(self)

def paintEvent(self, e): 事件

绘制的自动触发机制如下:

  1. 窗口第一次显示时,
  2. 窗口大小调整时,
  3. 窗口切换或遮挡,

绘制的”手动“触发机制:

  1. repaint()函数会强制产生一个即时的重绘事件;
  2. update()函数只是在Qt下一次处理事件时才调用一次绘制事件

class PushButton(QPushButton):

class PrimaryPushButton(PushButton):

class HyperlinkButton(QPushButton):

class RadioButton(QRadioButton):

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/120795
推荐阅读
相关标签
  

闽ICP备14008679号