pyqt 开源项目源码阅读

简介:

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类型

    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)

 class FluentStyleSheet(StyleSheetBase, Enum):

枚举类型中的属性 比如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文件。 

pyqt 开源项目源码阅读_第1张图片

小结: 

非常好的一个设计思路。

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

icon模块

FluentIconBase

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

自定义svg图片路径名

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

根据主题返回 icon

class FluentIcon(FluentIconBase, Enum):

    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'

pyqt 开源项目源码阅读_第2张图片

 

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):

你可能感兴趣的:(pyqt,pyqt)