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: 轮播组件上的窗口对象
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是一个通过点击左则选项来切换右侧界面的窗口
使用方式
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_())