Welcome to PyQtGuiLib’s documentation!

PyQtGuiLib

简介

这个qt-python的库,里面包含大量在自定义组件,各种美化QSS,以及QSS语法的解析器,还有一套动画框架.

Python版本需求

3.xxx 以上
推荐3.6以上(包含3.6)

安装方式

pip install PyQtGuiLib

python下qt支持的版本

PyQt5
PyQt6
PySide2
PySide6

系统支持

Win
Mac

组件文档

说明

这里包含所有自定义的组件

SlideShow(轮播组件)

  • 导入方式: from PyQtGuiLib.core import SlideShow

  • 信号: changeWidget
    说明: 切换窗口时触发
    
  • 类变量
    Ani_Left
    Ani_Right
    Ani_Down
    Ani_Up
    说明:动画方向模式类变量
    

addWidget(widget:QWidget)

  • 功能: 添加一个窗口到轮播组件

  • widget: 一个QWidget窗口,或者是继承与QWidget的窗口

setCurrentIndex(index:int=0)

  • 功能: 切换到指定窗口

  • index: 窗口索引(默认切换到0)

setAinDirectionMode(mode:tuple)

  • 功能: 设置窗口动画模式

  • mode: 这个参数必须包含两种模式

  • (SlideShow.Ani_Left,SlideShow.Ani_Right)
    例如这种,左右切换模式
    还有其他组合模式,请自行尝试,但是并不是所有的组合一定是正确的
    

setAutoSlideShow(b:bool,interval=1500,direction_:str=”R”)

  • 功能: 设置自动轮播

  • b: 是否启动自动轮播

  • interval: 每次轮播的时间间隔

  • direction_: 轮播的方向

  • R 表示 右或者下
    L 表示 左或者上
    轮播的方向会受到动画模式下影响
    

removeWidget(widget:QWidget)

  • 功能: 移除窗口

  • widget: 轮播组件上的窗口对象

getButtons()

  • 功能: 获取左右可点击按钮的对象

  • 返回值: tuple

setButtonsHide(b:bool)

  • 功能: 隐藏左右可点击按钮

  • b: 是否隐藏

count()

  • 功能: 返回窗口的数量

  • 返回值: int

getWidget(index:int)

  • 功能: 通过索引获取窗口

  • 返回值: QWidget对象


FlowLayout(流式布局)

  • 导入方式: from PyQtGuiLib.core import FlowLayout

addWidget(widget:QWidget)

  • 功能: 添加一个窗口到流式布局

  • widget: 一个QWidget窗口,或者是继承与QWidget的窗口

addItem(item: QLayoutItem)

  • 功能: 添加一个布局到流式布局

  • item: 布局对象(Eg: 垂直,网格之类,…..)

更多方法,可以之间参考其他的,方法名几乎都是一致的…

动画框架

说明

Animation是一个基于原生的动画基础上封装的一套简单易用型框架,可以对普通的控件添加动画,
也可以对控件的QSS属性添加动画,还能给画师所绘制的图形添加动画.

导入方式

from PyQtGuiLib.animation import Animation

一个简单列子来演示

from PyQtGuiLib.header import (
    QApplication,
    PYQT_VERSIONS,
    sys,
    QWidget,
    QPushButton,
    QRect,
    QPoint
)

# 动画框架
from PyQtGuiLib.animation import Animation

class Test(QWidget):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.resize(600,600)
        '''
             Animation 动画框架 案例一,移动一个按钮
        '''

        self.btn = QPushButton("按钮",self)
        self.btn.move(50,50)
        self.btn.resize(100,60)

        # 实例化动画类
        self.ani = Animation(self)
        # 设置动画时长
        self.ani.setDuration(2000) # 2秒

        # 对按钮添加移动动画
        '''
            addAni() 这个方法是一个非常常用的函数,用于添加一个动画
            参数是一个json格式,
            这里使用的参数含义
            targetObj:表示动画的作用对象
            propertyName: 动画的动作
            sv:起始值
            ev:结束值
        '''
        self.ani.addAni({
            "targetObj": self.btn,
            "propertyName": b"pos", # pos动作 是表示移动
            "sv": self.btn.pos(),
            "ev": QPoint(300,100)
        })
        # 开始动画
        self.ani.start()


if __name__ == '__main__':
    app = QApplication(sys.argv)

    win = Test()
    win.show()

    if PYQT_VERSIONS in ["PyQt6","PySide6"]:
        sys.exit(app.exec())
    else:
        sys.exit(app.exec_())

从这个例子不难看出addAni()这个方法是用来添加与动画相关的参数的,targetObj这个参数表示需要添加动画的对象,propertyName表示动画具体要执行的动作,sv和ev则表示动画的起始值和结束值,不同的动作,这里的值则不同.

目前所支持的参数

targetObj: 需要添加的动画对象,一般情况下这个参数都是必填项,只有有绘图时,不需要这个参数
    
propertyName:btype 动画的执行动作,必填项
    -- 普通控件常用的动作 geometry,size,pos,windowOpacity
    --- 支持绝大部分QSS属性动作,例如(background-color,color,...)
    --- value 这个动作比较特殊,一般只有在绘图动画才会使用
    
duration:int 动画执行的时间,可选参数(默认1000,就是1秒)
special: 动画的曲线参数,可选参数,内置了4种曲线(InCurve, OutBounce, CosineCurve, SineCurve) 
loop:int 动画循环次数,可选参数(默认1次)
    
call:fun 回调函数参数,可以在动画执行完成,调用一次,回调函数必须有一个参数 可选参数
argc:tuple 回调函数的参数 可选参数
  
sv: 动画的起始值,在大多数情况下可以写成"this"来指向自己当
atv:[()] 或者 [] 动画的插值  可选参数
ev: 动画的结束值
    
selector:str 选择器参数,在对QSS属性添加动画时,这个参数是必须的,其他情况可不写
qss-suffix:"px" qss属性单位 如果: 写宽度时单位是px,表示文字大小时,有时候会用到pt,ex  可选参数
        
comment:str  备注信息  可选参数

blendFlag:True/False 混合动画标志,表示在混合模式下这类动作是串行的  可选参数
    
# -------------------
注意 sv,atv,ev 中的值的参数类型必须一致
普通控件动画最简化版
{
    "targetObj":xx,
    "propertyName":"",
    "sv":xx,
    "ev":xx
}
QSS属性动画的最简化版
{
    "targetObj":xx,
    "propertyName":"",
    "sv":xx,
    "ev":xx,
    "selector":xx
}
绘图动画最简化版
{
    "propertyName":"",
    "sv":xx,
    "ev":xx
}

常用添加动画的函数

addAni(ani_data:dict)

  • 功能: 添加一个动画

  • ani_data: 动画的相关参数字典

addAnis(*argc)

  • 功能: 添加多个addAni()动画

  • argc: 多个动画的相关参数字典

addSeriesAni(ani_data: dict, variation: list)

  • 功能: 添加连续动画

  • ani_data: 动画相关参数

  • variation: 包含连续ev这个连续变化参数

  • 例子演示
    ani_data={
    "targetObj": xxx,
    "propertyName":b"pos",
    "sv":QPoint(0,0),
    "ev":QPoint(50,50)
    }
    variation = [QPoint(80,80),QPoint(100,100),QPoint(0,0)]
    
    类似这样的参数,值得注意的是variation中的每一个参数值,都必须和"ev"值的类型一致
    

addValuesAni(ani_data: dict, startObj: AniStartType, ends: AniEndType)

  • 功能: 添加一个绘图动画

  • ani_data: 动画的相关参数字典

  • startObj: 特殊的对象类型,具体的说明请看后面的介绍

  • ends:特殊的对象类型,具体的说明请看后面的介绍

addBlend(ani_datas: list)

  • 功能: 添加多个动画,来组成混合模式动画

  • ani_datas: 多个动画参数字典,如果参数中有"blendFlag"=True,则视为串行动画(默认并行动画),后面在具体介绍

start()

  • 功能: 运行动画

state()

  • 功能: 动画当前状态

pause()

  • 功能: 暂停动画

resume()

  • 功能: 恢复动画

getAni(index:int)

  • 功能: 获取所有已经添加的动画

  • 返回值类型: List[PropertyAnimation]

getCommentAni(comment:str)

  • 功能: 根据备注信息获取动画

  • 返回值类型: List[PropertyAnimation]

updateAni(ani:PropertyAnimation,new_datas:dict)

  • 功能: 更新单个动画的信息

  • new_datas: 新的动画参数,参数只需要写,你想更新的部分,对原有的其他参数不会有影响

removeAni(index:int)

  • 功能: 移除一个动画

  • index:索引/下标

QSS样式解析器

将原本不易操作的字符串静态样式,变为易操作的动态样式.
:字符串静态样式值的是原本写在setStyleSheet()中的样式,这里的样式对于需要动态修改时,十分的困难,当然你可以使用正则表达式,但是你想修改特定控件下的某个样式,即便是编写正则,也会显的非常繁琐,且容易出错,而QSS样式解析器的诞生就是为了解决这一系列问题.

导入方式

from PyQtGuiLib.styles import QssStyleAnalysis

一个简单例子来演示

from PyQtGuiLib.header import (
    PYQT_VERSIONS,
    QApplication,
    sys,
    QWidget,
    QPushButton,
    QLabel,
    Qt,
)
from PyQtGuiLib.styles import QssStyleAnalysis

class Test(QWidget):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.resize(600,600)


        self.setAttribute(Qt.WA_StyledBackground,True)

        self.l = QLabel("测试标签",self)
        self.btn = QPushButton("测试按钮",self)
        self.btn.setObjectName("btn")
        self.btn2 = QPushButton("测试按钮2号",self)
        self.l.move(30, 30)
        self.btn.resize(150, 80)
        self.btn.move(80, 80)
        self.btn2.resize(100,60)
        self.btn2.move(250,80)

        '''
            解析 测试1 
        '''

        # 创建一个针对整个窗口的 QSS 解析器
        self.qss = QssStyleAnalysis(self)
        # 对窗口上所有按钮,标签设置样式
        self.qss.setQSS('''
        /*===========这是一个按钮的QSS============*/
        QPushButton{
        color: rgb(0, 255, 127);
        background-color:rgb(0, 170, 0);
        }
        /*
            这是标签的样式
        */
        QLabel{
        color: rgb(42, 55, 127);
        background-color:rgb(255, 170, 0);
        }
        ''')
        print(self.qss.toStr()) # 返回样式的原始的类型
        print(self.qss.toDict()) # 返回样式的字典类型
        
        # 更新按钮的前景色
        self.qss.selector("QPushButton").updateAttr("color","yellow")


if __name__ == '__main__':
    app = QApplication(sys.argv)

    win = Test()
    win.show()

    if PYQT_VERSIONS in ["PyQt6","PySide6"]:
        sys.exit(app.exec())
    else:
        sys.exit(app.exec_())

在这个例子中QssStyleAnalysis(self)这句话就是实例化的QSS解析器,这里的参数self表示的是我想要

操作窗口的样式,setQSS()这个方法与setStyleSheet()都是一样的设置一个字符串样式,在这个例子在更新了按钮color的值,修改完成立即生效,看起来是不是很方便

下面来详情介绍方法的使用

setQSS(qss:str)

  • 功能: 设置一个字符串样式

setQSSDict(qss_dict:dict)

  • 功能: 设置一个字典形式的样式

  • {
        "QPushButton":{
             "color":"rgb(0, 255, 127)",
             "background-color":"rgb(0, 170, 0)"
          }
    }
    

appendQSS(qss:str)

  • 功能: 追加一个字符串样式(如果追加样式存在的,直接融合)

appendQSSDict(qss_dict:dict)

  • 功能: 追加一个字典形式的样式(如果追加样式存在的,直接融合)

selector(ang:Ang)

  • 功能: 返回一个选中器的QSS对象(参数是字符串或者是数字)

  • 这里的选择器是值的是样式的选择器,比如:QPushButton,QLabel,#abc,QPushButton:hover,...
    这些都是选择器
    
  • 返回值: QSS对象

selectorKey(key:str)

  • 功能: 根据选择器来返回QSS对象

  • 返回值: QSS对象

selectorIndex(i:int)

  • 功能: 根据索引来返回QSS对象

  • 返回值: QSS对象

removeSelector(ang:Ang)

  • 功能: 移除该选择器/索引下的所有样式

removeSelectorKey(key:str)

  • 功能: 移除该选择器下的所有样式

removeSelectorIndex(index:int)

  • 功能: 通过索引移除选择器下所有样式

isSelectKey(key:str)

  • 功能: 判断选择器是否存在

  • 返回值: 布尔类型

toStr()

  • 功能: 返回样式的字符串形式(如果样式中有注释,则去掉注释)

toDict()

  • 功能: 返回样式的字典形式(如果样式中有注释,则去掉注释)

header()

  • 功能: 返回选择器列表

count()

  • **功能:**返回控件样式的数量

QSS对象

header()

  • 功能: 返回选择器字符串

headerSubdivision()

  • 功能: 返回一个选择器列表

  • 假设选择器是 QWidget #btn 是这样的写的
    那么header()返回的就是QWidget #btn
    而headerSubdivision()返回的是 [QWidget,#btn]
    

body()

  • 功能: 返回当前选择下面的所有样式的字符串

bodySubdivision()

  • 功能: 返回当前选取器下样式的列表形式

bodyToDict()

  • 功能: 返回当前选取器下样式的字典形式

toDict()

  • 功能: 返回当前样式的字典形式

attr(key:str)

  • 功能: 获取一个属性的值

  • 比如 color:red;
    attr("color")  返回的是 red
    

updateAttr(key:str,value:str)

  • 功能: 更新/增加一个属性

removeAttr(key:str)

  • 功能: 移除某个属性

isAttr(key:str)

  • 功能: 判断一个属性是否存在

  • 返回类型: 布尔类型

toStr()

  • 功能: 返回当前样式字符串

SuperPainter

SuperPainter(超级画师),这个类保留原本QPainter类的所有功能,提供的样式的私有属性,并且新增了一个全新的概念,虚拟对象,原本QPainter所绘制的图形并不具备任何属性,但是虚拟对象的诞生可以让这些图形都变成一个个具有属性的,让图形k可以在paintEvent这个方法之外,具有查看,修改的能力.

模板窗口

模块窗口主要是为快速开发而生,已最快的方式来创建一个干净,漂亮的窗口界面,来帮你省去大量花费在设计界面的时间.

ListTemplateWindow

ListTemplateWindow是一个通过点击左则选项来切换右侧界面的窗口

_images/ListTemplateWindow.png

使用方式

from PyQtGuiLib.templateWindow import ListTemplateWindow

继承 ListTemplateWindow

主要方法

setHeadPicture(path:str)

  • 功能: 设置头像

  • path: 路径

addItem(text:typing.Union[str,QListWidgetItem],widget:QWidget,icon:str=None)

  • 功能: 添加节点和窗口

  • text: 节点文本

  • widget: 窗口

  • icon: 节点图标路径

addMenu(item:dict)

  • 功能: 添加菜单项(点击头像弹出)

  • item: 文本和回调函数(参数格式如下)

    {
    	"text":文本,
    	"call":回调函数
    }
    

addHeadWidget(widget:QWidget)

  • 功能: 添加头部窗口

细节设置

  • 重新设置左侧 QListWidget样式,用使用对象 self.listWidget

  • 重新设置头像 QPushButton样式,使用对象 self.btn_fold

  • 重新设置窗口的切换速度,使用方法 self.stackedWidget.setDuration()

例子

# -*- coding:utf-8 -*-
# @time:2023/4/1112:42
# @author:LX
# @file:test_listTemplateWindow.py
# @software:PyCharm
from PyQtGuiLib.header import (
    PYQT_VERSIONS,
    QApplication,
    sys,
    QWidget,
    QLabel,
    Qt
)

from random import randint
from PyQtGuiLib.templateWindow import ListTemplateWindow

'''
    测试 实际使用 模板窗口
'''

class myWidget(ListTemplateWindow):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)

        # 添加菜单
        self.addMenu({
            "text": "测试",
            "call": self.test,
        })

        # 添加头像
        self.setHeadPicture(r"D:\code\PyQtGuiLib\tests\temp_image\python1.png")

        # 添加页面
        self.addItem("首页",self.frist_page(),r"D:\code\PyQtGuiLib\tests\temp_image\python1.png")
        self.addItem("第二页",self.two_page(),r"D:\code\PyQtGuiLib\tests\temp_image\python1.png")

        # 头部窗口
        self.addHeadWidget(self.headWidget())

    def test(self):
        print("测试回调函数")

    def frist_page(self):
        widget = QLabel("我是首页")
        widget.setAlignment(Qt.AlignCenter)
        widget.setStyleSheet('''
background-color: rgb(229, 229, 229);
font: 22pt "黑体";
        ''')
        return widget

    def two_page(self):
        widget = QLabel("我是第二页")
        widget.setAlignment(Qt.AlignCenter)
        widget.setStyleSheet('''
        background-color: #ffd997;
        font: 22pt "黑体";
                ''')
        return widget

    def headWidget(self):
        widget = QLabel("头部窗口")
        widget.setAlignment(Qt.AlignCenter)
        widget.setStyleSheet('''
        font: 22pt "黑体";
                ''')
        return widget

if __name__ == '__main__':
    app = QApplication(sys.argv)

    win = myWidget()
    win.show()

    if PYQT_VERSIONS in ["PyQt6","PySide6"]:
        sys.exit(app.exec())
    else:
        sys.exit(app.exec_())

Indices and tables