Pyside
Pyside6简介
Pyside6是一个开源免费的GUI开发库,是Qt官方在Python上的qt功能的实现支持
该库可以开发窗口界面程序,相比PyQt(不是开源免费),没有版权上的问题.
未来规划: 学习完Pyside6后, 掌握C++语法,阅读官方文档.即可入手C++ QT开发
优势: 简单好用,文档齐全(请参照qt c++文档),跨平台支持,性能高(c++编写),
稳定性高(面向对象,信号(动作)与槽(函数)的机制,界面设计与业务代码完全隔离)
可以实现的功能
1. XML
2. 网络
3. 多线程
4. 数据库
5. 定位
6. 多媒体
7. web浏览器
8. 桌面ui(重点)......
生态支持 : Qt助手,Qt设计师(图形化设计ui界面)
开发环境准备
1. python3.9
2. pycharm
pycharm绑定python解释器
pycahrm创建项目并创建虚拟环境
3. pip install pyside6
4. 安装 微软VC++ 运行库合集软件
5. 配置pyside 的 pycharm工具设置
Qt Designer工具
文件详解
ui文件: qt界面文件
qrc文件: 资源文件(包含在qt设计师内添加的图片,视频,音频路径(py文件将自动以二进制形式把所有资源文件数据封装))
图片文件 ----> 资源文件
资源组1
----前缀1
----前缀2
资源组2
----前缀1
----前缀2
--> UI文件 --->Py文件(真实资源)
# 注意若ui文件内使用了资源,则ui转py后, 会导入 import 模块名_source文件
该文件需要将qrc转py
# 注意引用资源时
(:/qss资源路径)
(/本地资源路径)
# 桌面Qt Designer快捷方式
将python 虚拟环境\Lib\site-packages\PySide6\designer.exe 创建快捷方式到桌面
# pycharm pyside6 外部工具配置 文件--->设置---->工具--->外部工具
qt设计师
程序: 虚拟环境\Lib\site-packages\PySide6\designer.exe
工作目录: $ProjectFileDir$
ui转py
程序: 虚拟环境\Scripts\pyside6-uic.exe
实参: $FileName$ -o $FileNameWithoutExtension$.py -x
(-x 生成的py文件自带main方法,可以直接运行)
工作目录: $FileDir$
qrc转py pyqrc $FileName$ -o $FileNameWithoutExtension$.py
程序: 虚拟环境\Scripts\pyside6-rcc.exe
实参: $FileName$ -o $FileNameWithoutExtension$_rc.py
工作目录: $FileDir$
学习内容
基础程序结构
各种控件的特性和使用
控件的样式
资源的加载
控件的布局
事件和信号
动画特效
界面跳转
设计工具使用 (开发必备)
额外 (网络,多线程,数据库,文件操作,绘图,多媒体,定时器,定位,国际化…)
库结构
QtWidgets 包含整套UI元素控件,用于建立符合系统风格的界面
QtGui 涵盖了多种基本图像功能的类(字体,图形,颜色...)
QtCore 涵盖了包的核心[非GUI功能](时间,文件,目录,数据类型,文本流,链接,线程进程....)
QtWebKit 浏览器引擎
QtTest 测试
Qtsql 数据库
QtMultimedia (多媒体)
QtMultimediaWidgets (多媒体)
Qt 将基本全部模块综合到单一的模块中 坏处(占用内存) 好处(比较方便) 待修改!!!!
................
入门
程序的基本结构
面向过程版
import sys
from PySide6.QtWidgets import QApplication,QWidget # 导入模块
# 创建应用程序
app = QApplication(sys.argv) # sys.argv显示当前文件的目录位置以及其它参数的列表,将文件路径传递给对象用于构建应用程序
# sys.argv用于接收命令行参数 使用时argy[索引]
# 创建窗口
window = QWidget()
# 窗口控件的设置
window.setWindowTitle("Pyside6 GU基本结构")
window.resize(500, 500) # 设置尺寸
# 展示窗口界面
window.show()
# 开始执行应用程序,并进入事件循环 app.exec()
sys.exit(app.exec()) # sys.exit() 应用程序结束,状态码为0(用于收集应用程序状态码,并关闭主程序),
步骤: 创建应用程序---> 创建窗口 -----> 控件,界面,布局的操作 ---->准备显示窗口 --->启动应用程序,并进入消息循环
(尺寸,位置,样式,子控件,信号与槽...)
面向对象版
from PySide6.QtWidgets import QApplication, QWidget
class Window(QWidget): # 继承QWidget类
def __init__(self):
super().__init__() # 调用父类方法
# 窗口控件的设置
self.setWindowTitle("Pyside6")
self.resize(500, 500)
self.setup_ui()
# 子控件设置
def setup_ui(self):
pass
# 用于测试 导入时不执行
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())
import sys
from PySide6.QtWidgets import QApplication
from 类 import Window
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())
解释
面向过程版本不易维护和扩展
面向对象版本易于移植
1.一个Qt程序都需要一个应用程序对象
它包括主事件循环,来自窗口系统和其它资源的所有事件被处理和调度
它也处理应用程序的初始化和结束,并且提供对话管理
它也处理绝大多数系统范围和应用程序范围的设置
2. 开始执行应用程序,并进入事件循环 app.exec()
3.一个没有父对象的控件默认不显示,必须调用show()才可以
4.一个应用程序内可以显示多个顶级控件
如果一个控件没有设置父级控件,则把它当顶级控件(窗口),并添加基本的特性(标题栏,标题,图标,最大,最小,关闭)
子控件设置父控件 对象 = 子控件(父控件), 子控件无法修改父控件,父控件内将显示子控件(先显示父,再显示子)
控件可以作为一个容器承载其它控件
应用程序流程
-
创建应用程序对象
app = QApplication(sys.argv)
-
创建控件
如: window = QWidget()
设置控件(大小,尺寸,位置,样式,信号和槽…)
展示控件
window.show()
-
应用程序的执行,进入消息循环 (监听用户的交互信息)
app.exec()
-
主程序正常退出
sys.exit(app.exec())
通用方法
窗口:
setTest()
setWindowTitle()
控件:
resize() 尺寸
move() 位置
控件概述
一个程序界面上各个独立的元素(一块矩形区域),具备不同的功能(点击,输入,显示,容器.....)
一.按钮控件
QPushButton (可以双击,单击,右击...)
QCommandLinkButton(链接页面跳转)
QRadioButton(单选按钮)
QCheckBox(复选按钮)
二.输入控件
纯键盘输入
QLineEdit(单行输入框)
QTextEdit(多行输入框,带有垂直滚动条)
QPlainTextEdit(文件输入框 带有滚动条)
QKeySequenceEdit(按键识别框(识别按下的按键))
步长调节(QAbstractSpinBox
) (键盘+鼠标)
QDateTimeEdit(时间输入框,可以按键调节时间(年月日时分秒))
---- QDateEdit(可以调节 年月日)
---- QTimeEdit(可以调节 时分)
QSpinBox(整数输入框,可以按键调节)
QDoubleSpinBox(小数输入框,可以按键调节)
组合框(下拉选择输入框)
QComboBox(下拉选择输入框) # 注意可以 右击--编辑项目 (添加图标 + 文字)
QFontComboBox(字体下拉选择输入框)
滑块
滑块(QAbstractSlider)(鼠标)
QDial(旋钮滑块 不带数值显示器)
QSlider(垂直调节滑块 带数值显示器)
QScrollBar(水平调节滑块 不带数值显示器)
选取区域
QRubberBand(选取区域)
对话框
QColorDialog(打开颜色对话框,选取颜色)
QFileDialog(打开文件对话框,选取文件)
QFontDialog(打开字体对话框,选取字体)
QInputDialog(打开输入对话框,输入文字)
日期
QCalendarWidget(日历 可以选择年月日)
三.显示控件
# 注意按钮还可以添加图标
QLabel(文本,数字,带样式的文本(富文本), 超链接, 图片容器(静态图片,动态图片(gif)) 显示)
----GIF图片需要代码实现 # QLabel().setMovie()
movie = QMovie(本地文件/资源文件) # movie = QMovie(":/qss前缀/文件")
QLabel目标对象.setMovie(movie)
# 缩放 QLabel目标对象.setScaladSize(Qsize(x,y))
movie.start()开启动画
# 属性
setAlignment() : 设置文本的对齐方式
setIndent() : 设置文本的缩进
text() : 获取文本内容
setBuddy(): 设置伙伴关系
setText(): 设置文本内容
selectedText(): 返回所选字符
setWordWrap(): 设置是否允许换行
QLable常用的信号(事件)
当鼠标滑动QLable控件时触发: linkHovered
当鼠标单击QLable控件时触发: linkActivated
QLCDNumber(液晶数字显示)
QProgressBar(进度条显示)
对话框(QDialog)
-------QMessageBox(提示/警告/错误/确认/信息 信息提示对话框)
-------QErrorMessage(错误信息对话框)
-------QProgressDialog(进度信息对话框)
四.容器控件
QToolBox(工具容器 每一个选项卡都是一个单独的页面)
QDialogButtonBox(对话框多按钮容器 类似选项卡)
QGroupBox(组容器 控件归组)
QMdiSubWindow(窗口容器 容纳子窗口)
-----QMdiArea和QMdiSubWindow()
五.结构控件
(1). QMainWindow
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UfpvVoCc-1676773758208)(D:/Python Stack/库/pyside6/images/常用控件/QMainWindow.png)]
主窗口: 有标题栏,最大/最小/关闭按钮,菜单栏,工具栏,窗口,状态栏
相关控件;QMenuBar(菜单栏 下拉菜单,子菜单) ---QMenu
QToolBar(工具栏 )
-----QToolButton() 工具栏按钮
QStatusBar(状态栏 窗口底部)
----showMessage('只存在5秒的消息', 5000) # 消息时间
(2).QTabwidget
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9WEAMd3N-1676773758209)(D:/Python Stack/库/pyside6/images/常用控件/QTabwidget.gif)]
标签栏: 一个标签显示一个局部窗口
相关控件; QTabBar(标签条)
(3). QStackedWidget(窗口栈: 承载多个窗口 顺序切换)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ElCcFz0T-1676773758209)(D:/Python Stack/库/pyside6/images/常用控件/QStackedWidget.gif)]
(4).QSplitter(分割窗口)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NrUWxgEy-1676773758210)(D:/Python Stack/库/pyside6/images/常用控件/QSplitter.gif)]
(5).QDockWidget(悬浮窗口 停靠在上下左右)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CZfOEbGs-1676773758210)(D:/Python Stack/库/pyside6/images/常用控件/QDockWidget.gif)]
六.滚动控件
(1). QTextBrowser(文本浏览器 有垂直滚动条 有定位)
(2).QScrollArea(屏幕浏览器 用于浏览屏幕(如图片) 有水平,垂直滚动条)
(3).QAbstractItemView
1.QColumnView
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8CuBbuit-1676773758210)(D:/Python Stack/库/pyside6/images/常用控件/滚动/QColumnView.gif)]
2.QHeaderView
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2OK2zvYy-1676773758211)(D:/Python Stack/库/pyside6/images/常用控件/滚动/QHeaderView.png)]
3.QListView
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O2msfRkP-1676773758211)(D:/Python Stack/库/pyside6/images/常用控件/滚动/QListWidget.gif)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CfXhYnta-1676773758211)(D:/Python Stack/库/pyside6/images/常用控件/滚动/QUndoView.gif)]
4.QTableView
-----QTableWidget()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G5ior7nR-1676773758212)(D:/Python Stack/库/pyside6/images/常用控件/滚动/QTableWidget.png)]
5.QTreeView
-----QTreeWidget()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0rZjddK4-1676773758212)(D:/Python Stack/库/pyside6/images/常用控件/滚动/QTreeWidget.gif)]
(4).QMdiarea( 子窗口)
(5).QGraphicsView(绘图/画板窗口)
七.辅助控件
(1).QFocusFrame(按钮获取焦点 按钮选中会突出显示,且按钮块有边框)
(2).QSizeGrip(窗口可按比例拉伸 右下角标记)
(3).QDesktopWidget(获取屏幕的信息(尺寸…))
八.其它
(1). 向导/打印(QDialog)
1.QWizard()
------QWizardPage()
2.QAbstractPrintDialog(打印对话框)
------QPrintDialog
3.QPrintPreviewDialog(打印预览对话框)
------QPrintPreviewWidget
4.QPageSetupDialog(打印页面设置)
(2).欢迎界面QSplashScreen
-------QSplashScreen(无标题栏,状态栏,无边框界面)
(3).功能性控件
1.QVideoWidget(视频窗口)
2.QCameraViewfinder(摄像头窗口)
3.(多媒体窗口)
4.QWebEngineView(浏览器窗口)
5.打开超链接 QDesktop.Services.openURL(QUrl(link))
不同的控件
特性
相同特性: 名字。矩形区域,位置,大小,设置样式..
不同特性: 显示,输入,交互,容器,框架...
Object设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGDkZaQb-1676773758212)(F:/Python Stack/库/pyside6/images/常用控件/QObject.png)]
对象属性API
Object.setTest()
Object.setWindowTitle()
Object.resize() 尺寸
Object.move() 位置
Object.setObjectName("ID名称") # 给对象设置ID,便于选择器的操作
Object.objectName() 获取对象名称
Object.setProperty("属性名","属性值") 动态添加属性和值
Object.property("属性名称") 获取对象属性值
Object.dynamicPropertyName() 获取一个对象内所有通过setProperty(设置的属性名称)
Object.setStyleSheet("qss样式表设置")
# 应用于qss ID选择器,属性选择器(方便统一样式), 用于装饰器的修饰 [多个同一控件相同/不同的样式]
# qss绑定好的id被其它控件使用,那么其它控件样式自动修改为其id样式.
父子对象API
A ------b
--------d间接
------C
直接
setParent(parent) 设置父对象(父对象只能设置一个,子对象也可以被继承(子对象此时成为继承对象的父对象)用于创建父子关系)
parent() 获取父对象
children() 获取所有子对象 获取一级(直接)
findChild(参数1,参数2,参数3) 获取某一个指定名称和类型的子对象
参数1:Object类型/类型元组
参数2:名称 notice (可以省略)
参数3: 查找选项 FindChildRecursively(递归查询/默认选项)
FindDirectChildrenOnly(只查找直接子对象)
findChildren(参数1,参数2,参数3)
# 应用场景
内存管理(父控件销毁,子控件也销毁)
如果一个控件没有父控件,则会当成顶级控件(窗口),多个顶级控件相互独立
把一个控件放入一个控件的内部,可以设置父子关系
----显示位置受父控件的约束(尺寸最大不超过父控件)
----生命周期被父对象接管
内存管理机制
Object继承树:
所有的对象都是直接或间接的继承Object
Object在一个对象中组织他们自己(当创建一个Object时,如果使用其它对象作为其父对象,那么它就会被添加到父对象的children列 表内)
父子关系: 当一个父对象被销毁后,子对象也会被销毁
QWidget:
扩展了父子关系
当一个控件设置了父控件: 1.该控件会在父控件内
2.该控件受到父控件区域裁剪
3.父控件被销毁时,子控件会自动被销毁
场景案例:
一个对话框内,上面有很多操作按钮(按钮和对话框本身是父子控件关系)
操作时,操作的对话框控件是本身,而不是其内部的子控件(按钮)
当对话框被删除时,内部子控件也会删除
信号与槽机制
信号和槽是 Qt中的核心机制,主要作用在对象之间进行通讯, 所有继承QWidget的控件都支持该机制
信号: 当控件状态发送改变时(如点击),发送一个指定的信号
槽: 监听指定的信号,并执行槽所绑定的方法.
连接方式: object.信号.connect(槽函数)
内置信号: clicked,pressed....
自定义信号: PysideSingnal()
槽; 不同控件都内置槽函数
自定义槽: 自定义方法
特性: 一个信号可以连接多个槽函数
一个信号也可以连接另外一个信号 (串联式触发(一个触发后,触发另一个,再触发下一个))
信号的参数可以是任何python类型
一个槽可以监听多个信号
作用: 监听信号,相应行为,信号与槽的机制
API
widget对象.信号.connect(槽)
widget.blookSignals(bool) 临时阻断/恢复信号和槽的连接(True/False)
widget.receivers(信号) 获取信号连接槽的数量
QObject.信号/槽.disconnet() 取消连接信号与槽
-----控件
-----槽
信号:
signalsBlocked 信号是否被阻止
objectNameChanged 对象名称发生改变时触发信号
windowTitleChanged 窗口标题名称发生改变时触发信号
destroyed(obj) 对象被销毁时,发射此信号
类型判定
isWidgetType() 判断对象是否为控件类别
inherits(父类) 判断对象是否直接/间接继承父类
### 还可以使用父子对象api实现同一功能(步骤多一点)
用于筛选控件
对象删除
obj.deleteLater()
删除一个对象时,会解除与父对象之间的联系
不会立即将对象销毁,而是向主消息循环发送一个event,下一次主消息循环接受到event后才会销毁该对象
(可以延迟删除的时间内完成以下操作,坏处时内存释放不及时)
# 想要移除某一个对象时,可以使用
del 对象 立即删除
定时器
from PyQt5.QtCore import QTimer
time = QTimer() # 创建定时器对象
time.satrt(1000) # 设置定时器间隔时间
time.timeout.connect(fun) # 定时器绑定的事件
def fun():
# 定时器要做的事情
语言翻译
在pyside6目录下 找到linguist.exe
位置大小
QWidget
可视化控件的基类
是一个简单的空白控件,控件是用户界面的最小单元,每个控件都是矩形的,控件由父控件和前面的控件剪切,没有父控件的控件是窗口.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ANYkPNgz-1676773758213)(D:/Python Stack/库/pyside6/images/常用控件/屏幕坐标系.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y215uk8f-1676773758213)(D:/Python Stack/库/pyside6/images/常用控件/尺寸.png)]
位置大小(应用于控件布局)
resize() 尺寸
move() 位置
# 获取
y() 相对于父控件的x位置(包含窗口框架) / 顶层控件(没有父控件)则相对于桌面的x位置
y() 相对于父控件的y位置(包含窗口框架) / 顶层控件(没有父控件)则相对于桌面的y位置
pos() x()和y()的组合 [相当于QPoint(x, y)]
width() 控件的宽度,不包含任何窗口框架
height() 控件的高度,不包含任何窗口框架
size() width和height的组合 [QSize(width, height)]
geometry() 用户区域相对于父控件的位置和尺寸组合 [QRect(x, y, width, height)]
rect() 0, 0, width, height的组合 [QRect(0, 0, width, height)]
frameSize() 框架大小
frameGeometry() 框架尺寸
### 注意: 控件显示完毕之后, 具体的位置或者尺寸数据才会正确
# 设置尺寸
move(x, y) 操控的是x, y;也就是pos 包括窗口框架
resize(width, height) 操控的是宽高 不包括窗口框架
setGeometry(x_noFrame, y_noFrame, width, height) 注意,此处参照为用户区域
adjustSize() 根据内容自适应大小
setFixedSize() 设置固定尺寸
#
最大最小尺寸( 用于限定控件大小)
# 获取
minimumSize() 最小尺寸
maximumSize() 最大尺寸
minimumWidth() 最小尺寸的宽度
minimumHeight() 最小尺寸的高度
maximumWidth() 最大尺寸的宽度
maximumHeight() 最大尺寸的高度
# 设置
setMinimumSize() 最小尺寸
setMaximumSize() 最大尺寸
setMinimumWidth() 最小尺寸的宽度
setMinimumHeight() 最小尺寸的高度
setMaximumWidth() 最大尺寸的宽度
setMaximumHeight() 最大尺寸的高度
# 注意: 控件完全展示前后会有所差异
内容边距(控件内部的区域)
设置内容边距 setContentsMargins(左, 上, 右, 下)
获取内容边距 getContentsMargins((左, 上, 右, 下)) 元组
获取内容区域 contentsRect()
# 注意: 必须是控件本身留够对应的大小
# 作用: 调整控件内容边距, 使得显示更好看
鼠标
设置鼠标形状: setCursor()
Qt.ArrowCursor 箭头
Qt.CrossCursor 十字准星
Qt.IBeamCursor I型编辑
Qt.WaitCursor 沙漏等待
Qt.ForbiddenCursor 禁止
Qt.PointingHandCursor 食指点击
Qt.OpenHandCursor 手掌
自定义
重置形状: unsetCursor()
获取鼠标: cursor() -> QCursor
鼠标跟踪:
hasMouseTracking() 判定是否设置了鼠标跟踪
setMouseTracking(bool) 设置鼠标是否跟踪
# 所谓的鼠标跟踪,其实就是设置检测鼠标移动事件的条件
不跟踪: 鼠标移动时,必须处于按下状态,才会触发mouseMoveEvent事件
跟踪: 鼠标移动时,不处于按下状态,也会触发mouseMoveEvent事件
QCursor对象 :
pixmap() pos() setPos(x, y) ......
作用: 根据特定场景, 设置鼠标样式; 使得用户交互时更加明确
鼠标移动时,控件跟随鼠标移动
鼠标设置为指定图标
事件
显示和关闭事件 :
showEvent(QShowEvent) 控件显示时调用
closeEvent(QCloseEvent) 控件关闭时调用
移动事件: moveEvent(QMoveEvent) 控件移动时调用
调整大小: resizeEvent(QResizeEvent) 控件调整大小时调用
鼠标事件:
进入和离开事件: enterEvent(QEvent)鼠标进入时触发 leaveEvent(QEvent)鼠标离开时触发
mousePressEvent(QMouseEvent) 鼠标按下时触发
mouseReleaseEvent(QMouseEvent)鼠标释放时触发
mouseDoubleClickEvent(QMouseEvent)鼠标双击时触发
mouseMoveEvent(QMouseEvent)鼠标按下后移动时触发
setMouseTracking(True)追踪设置后,没有按下的移动也能触发
键盘事件:
keyPressEvent(QKeyEvent) 键盘按下时调用
keyReleaseEvent(QKeyEvent) 键盘释放时调用
焦点事件 focusInEvent(QFocusEvent) 获取焦点时调用
focusOutEvent(QFocusEvent) 失去焦点时调用
拖拽事件 dragEnterEvent(QDragEnterEvent) 拖拽进入控件时调用
dragLeaveEvent(QDragLeaveEvent) 拖拽离开控件时调用
dragMoveEvent(QDragMoveEvent) 拖拽在控件内移动时调用
dropEvent(QDropEvent) 拖拽放下时调用
绘制事件 paintEvent(QPaintEvent) 显示控件, 更新控件时调用
改变事件 changeEvent(QEvent) 窗体改变, 字体改变时调用
右键菜单 contextMenuEvent(QContextMenuEvent) 访问右键菜单时调用
输入法 inputMethodEvent(QInputMethodEvent)输入法调用
# 作用
当一个控件被触发了一个特定的行为时, 就会调用特定的方法, 来将事件传递给开发人员, 方便处理
重写这些事件方法, 就可以监听相关的信息
对话框
文件对话框
获取文件:
filename, filtetused = QFileDialog.getOpenFileName(self, "提示文字", "打开路径", "过滤器")
过滤器: All(*.*);;Python文件(*.py)
字体对话框
界面
1.添加界面
2.切换界面 (当前界面被新界面填充)
3.界面的跳转 (当前界面跳转到新界面)
QSS 样式表
样式
Qss用于自定义控件外观的一种本机制,可以类比CSS,但没有CSS强大(选择器少,属性少,有些属性仅适用于部分控件)
格式: 选择器[:伪状态<可选参数>]
{
属性:属性值;
}
QSS选择器:
类型选择器: 控件名 会选择父子类
类选择器: .控件类名 不会选择子类
ID选择器: 控件名#ID名 ID设置: 控件.setObjectName("ID名")
属性选择器 控件名[属性=”属性值”] 属性设置: 控件.setProperty("属性名","属性值")
后代选择器: 父类#ID名
QSS样式:
文件设置(全局设置):
创建文件:
Style.qss文件内容:
选择器 {
属性:属性值;
}
使用文件:
with open(“Style.qss”,’r’) as file:
qApp/app.setStyleSheet(file.read()) 导入Style(作用于此应用程序) # 使用与sys.exit()前
------------------------------------------------------------------------------------------------------------
属性: 属性值
background : 背景颜色值
-color: 颜色值
---transparent; 透明穿越
-image:url(地址)
-position: 位置(top/left/right/bottom)
-origin:padding(默认)/content/border/ 参照
-repeat: no-repeat (不重复)
-clip:padding(默认)/content/border 按照指定区域裁剪
-attachment: scroll/fixed(背景图片跟随/不跟随页面其余部分的滚动而滚动)
border: 线宽 线性 颜色
margin: 外边距(top right bottom left)
-top/right/bottom/left
-max/min-height: 最大/小高度
-max/min-width: 最大/最小宽度
padding: 内边距(top right bottom left)
-top/right/bottom/left
-style:top/right/bottom/left
-top/right/bottom/left: 属性值
-color: 颜色值
-radius:圆角半径
# resize调整的是盒子模型的尺寸(包含外边距 外边距变大,内边距变小)
color: 文本颜色值(前景色)
font: 字体
-family:"中英文字体名"
-size:字体大小
-style:字体样式
-weight:字体粗细
height: 高度
width: 宽度
icon: 图标 仅支持QPushButton
-size:尺寸
image:url(:地址) 图像
left:左边偏移量
right:右边偏移量
top:上边偏移量
position: 定位
-relative: 相对定位(top/left/right/bottom)
-absolute: 绝对定位(top/left/right/bottom)
text-align:文本/图标对齐方式 QPushButton 和 QProgressBar 支持
伪状态:
# 注意伪状态可以连着用
:active 当小部件驻留在活动窗口中时,将设置此状态
:checked 该控件被选中时候的状态
:unchecked 该控件未被选中
:hover 鼠标在控件上方
:pressed 该控件被按下时的状态
:focus 该控件有输入焦点时
:disable 控件失效时
:enable 控件有效时
:disabled 该控件禁用时的状态
:indeterminate checkBox或radioButton部分被选中时
:on 控件处于on时
:off 控件处于off时
:first 该控件是第一个(列表中)
:has-children 该控件有孩子。例如,QTreeView中包含子项目的控件
:open 该控件处于打开状态。例如,QTreeView中的扩展项,或打开菜单的QComboBox或QPushButton
动画
QAbstractAnimation
-------QAnimationGroup
------QParalleQAnimationGroup
------QSequentialQAnimationGroup
-------QAnimation
-------QvariantAnimation
-------QPropertyAnimation
1. 创建动画对象,并设置目标 属性
常用属性: geometry = QRect(坐标x,坐标y,尺寸x,尺寸y)
pos = QPoint(x,y)
size = QSize(x,y)
windowOpacity = 1/0 透明度
am = QPropertyAnimation(self)
am.setTargetObject(目标对象)
am.setPropertyName(b"pos")
# am = QPropertyAnimation(目标对象,b"pos",self)
2. 设置属性值( 开始 插值 结束 )
am.setStartValue(QPoint(0,0)) # 开始
am.setKeyValueAt(时长,属性值) # 插入值 从动画开始第 x秒开始,设置指定属性值
am.setKeyValueAt(时长,属性值) # 插入值从动画开始第 x秒开始,设置指定属性值
#......................... am.setKeyValueS
am.setEndValue(QPoint(300,300)) # 结束
3. 动画时长
am.setDutation(3000)
# 添加动画曲线 (非必要)
am.setEasingCurve(QEasingCurve.InQuad) 线性 (匀速)
am.setEasingCurve(QEasingCurve.OutQuad) 缓慢降速 (快~慢)
4. 启动动画
am.start()
其它属性
# 循环操作
am.setLoopCount(整数次数) # 设置动画循环次数
am.currentLoop() # 获取当前循环次数 从0开始
am.currentLoopTime() # 获取当前循环内的时间
# 动画方向 默认动画的方向是开始时间到结束时间 修改为结束到开始
am.setDirection(QAbstractAnimation.Direction) ---》简写am.setDirection(1/0)
--------QAbstractAnimation.Forward 动画的当前时间随着时间而增加 (值1)
--------QAbstractAnimation.Backward 动画的当前时间随着时间而减少 (值0)
am.direction() ---> QAbstractAnimation.Direction
# 获取时间
am.duration() 获取单次时长
am.totalDuration() 获取动画总时长
am.currentTime() 获取当前时长
# 获取动画状态
am.state() QAbstractAnimation.State
-----------------QAbstractAnimation.Stopped 停止状态(返回值为布尔)
-----------------QAbstractAnimation.Paused 暂停状态(返回值为布尔)
-----------------QAbstractAnimation.Running 运行状态(返回值为布尔)
# 常用操作
am.start([动画策略,非可选])
---QabstactAnimation.KeepWhenStopped 停止时不会删除动画
---QabstactAnimation.DeleteWhenStopped 停止时会删除动画
am.pause()
am.resume()
am.stop()
am.setCurrentTime()
am.setPause()
# 常用信号
currentLoopChanged() 动画循环时发送信号
directionChanged() 动画发生时发生信号
finished() 动画结束时发生信号
stateChanged(新状态,旧状态) 动画状态发生改变发生信号
动画组(串联/并联动画)
# 将多个动画 串联(一个接一个) 并联(同时 [非阻塞]) 运行
# 动画默认是并行的
# 动画组与图片动画拥有相同的方法
# 并行动画组
am_group = QParalleAnimationGroup(self)
am_group.addAnimation(am1)
am_group.addAnimation(am2)
am_group.start()
# 串行动画组
am_group = QSequentialAnimationGroup(self)
am_group.addAnimation(am1)
am_group.addAnimation(am2)
# 可以添加暂停后执行 am_group.addPause(时间) / setDuration(时间)
am_group.start()
补充: 串行动画组信号 currentAnimationChanged()
# 功能
##添加动画
addAnimation()
insertAnimation()
# 移除动画 removeAnimation()
#获取动画 animationAt()
#获取并移除 takeAnimation()
#动画个数 animationCount()
# 清除动画 clear()
实用效果
1."花瓣"聚合与绽放
# 方法一
步骤:
1.开启"菜单"按钮的 checkable 选中属性 ,当点击按钮时状态选中(true),取消按钮时状态取消(false)
2.创建序列动画组
3.循环遍历控件对象
4.---- 创建动画,绑定对象,
5.----判断“菜单按钮"选中状态
----true 添加属性,设置开始属性值,设置结束属性值,设置动画曲线,添加到动画 (绽放)
---动画效果(显示属性开启,以动画曲线执行动画将各个按钮移动到各自坐标上)
----false 添加属性,设置结束属性值,设置开始属性值.添加到动画 (聚合)
---动画效果(以动画曲线执行动画将各个按按钮移动到菜单按钮位置,并关闭显示属性)
# 方法一: 调节动画的开始与结束顺序可以达到反转效果
6. 动画添加到动画组
动画组.addAnimation(动画对象)
7.启动动画组
# 方法二 反转单个动画方向
步骤:
1.开启"菜单"按钮的 checkable 选中属性 ,当点击按钮时状态选中(true),取消按钮时状态取消(false)
2.创建序列动画组
3.循环遍历控件对象
4.---- 创建动画,绑定对象,
5.----判断“菜单按钮"选中状态
---- 添加属性,设置开始属性值,设置结束属性值,设置动画曲线,添加到动画 (绽放)
---动画效果(显示属性开启,以动画曲线执行动画将各个按钮移动到各自坐标上)
# 方法二: 调节动画的方向可以达到反转效果
# am.setDirection(QAbstractAnimation.Direction)
--------QAbstractAnimation.Forward (1) 动画的当前时间随着时间而增加
--------QAbstractAnimation.Backward (0) 动画的当前时间随着时间而减少
6. 动画添加到动画组
动画组.addAnimation(动画对象)
7.启动动画组
# 方法三 (1.2): amgroup.setDirection(checkable) # 选中则 正运行,不选择则 反运行
# 方法三: 反转动画组方向
步骤:
1.开启"菜单"按钮的 checkable 选中属性
当点击按钮时状态选中(true),取消按钮时状态取消(false)
2.创建序列动画组
3.循环遍历控件对象
4.---- 创建动画,绑定对象,
5. -----添加属性,设置开始属性值,设置结束属性值,设置动画曲线,添加到动画 (绽放)
6. 动画添加到动画组 动画组.addAnimation(动画对象)
7. ----判断“菜单按钮"选中状态,反转动画组 动画组.setDirection(checkable)# 选中则 正,不选择则 反
8.启动动画组
2.滑窗
原理: 将一个窗口以动画显示移动到另一个窗口的位置即可
方法: 1.两个窗口设置父子关系
2.不设置父子关系(一个窗口关闭,另一个不关闭),只是单独的利用动画移动位置
3.不设置父子关系, 一个窗口显示(show),一个窗口隐藏(hide)/关闭(close)
非父子关系
# 利用动画移动位置
父子关系
# 父控件 与 子控件 之间的关系 ---- 多窗口动画切换的实现
级联与冲突
级联;
qss可以在QApplication,父控件,子控件中设置
一个控件的最终样式,会受到父控件和QApplication的影响
冲突:
如果一个控件作为后代控件,被多个祖先控件影响,则会不同的属性产生叠加,相同属性产生覆盖
功能封装
#Style.qss
选择器 {
属性:属性值;
}
# 封装加载qss样式类 QssSetings.py
class Qss:
@staticmethod
def set_qss(file_path,object):
with open(file_path,’r’) as file:
object.setStyleSheet(file.read())
# 使用qss样式类
from QssSetings import Qss
Qss.set_qss("Style.qss",app)
qt第三方库样式
Qt Designer
图形化界面开发工具(Qt设计师) 优点:加速开发,高效,所见即所得,界面逻辑分离(MVC架构)
控件仅仅是qt系统提供的控件
自动生成Ui文件,后期可以将ui转py文件
显示方法
1.加载ui文件
#----------------------------
import sys
from PySide6 import QtCore, QtGui, QtWidgets
from PySide6.QtUiTools import QUiLoader
loader = QUiLoader()
app = QtWidgets.QApplication(sys.argv)
window = loader.load("main.ui")
window.show()
app.exec()
# ----------------------------------------
#from PySide6.QtUiTools import QUiLoader
import sys
from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QApplication
from PySide6.QtCore import QFile, QIODevice
if __name__ == "__main__":
app = QApplication(sys.argv)
ui_file_name = r"ui文件路径"
ui_file = QFile(ui_file_name)
if not ui_file.open(QIODevice.ReadOnly):
print(f"Cannot open {ui_file_name}: {ui_file.errorString()}")
sys.exit(-1)
loader = QUiLoader()
window = loader.load(ui_file)
ui_file.close()
if not window:
print(loader.errorString())
sys.exit(-1)
window.show()
sys.exit(app.exec())
2.加载ui转换后的py文件
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QFile
from UI文件 import Ui类
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui类()
# self.setAttribute(Qt.WA_StyledBackground, True) 开始自定义背景
self.ui.setupUi(self)
def 槽函数(self):
pass
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
"""
class MainWindow(QMainWindow,Ui类):
def __init__(self):
super(self).__init__()
self.setupUi(self)
def 槽函数(self):
pass
"""
信号和槽
# 匿名函数 对象.槽函数 = lambda()
# 类函数 del 槽函数(self):
pass
伙伴关系
样式表
1.颜色
2.字体
3.资源
布局管理器
类型提升
使用其它控件(qt控件(除设计师内置的控件之外的),自定义控件)
待
1.事件,自定义事件
2.信号,自定义信号
GUI程序的打包
pyinstall
各个平台单独打包的工具(所打包出来的程序不能跨平台)
pyinstaller [option] 模块.py
-F 打包成一个exe文件
-D 创建一个目录(包含exe,和一些依赖) 默认
-c (小写) 使用控制台
-w (小写) 使用窗口
# pyinstaller -F -w 本地播放器.py --hidden-import PySide6.QtSvg --paths=C:\Users\20715\Desktop\PySide\venv\Lib\site-packages\shiboken6
# pyinstaller -F -w --icon=播放器.ico 本地播放器.py --hidden-import PySide6.QtSvg --paths=C:\Users\20715\Desktop\PySide\venv\Lib\site-packages\shiboken6
思想
MVC架构
封装重构思想
分层思想
配置文件分离
文档
Pysider+ Echarts
setHTML加载
# html引用时用 链接文件地址
# 适合 pyecharts文件之间使用
在HTML文件中引用
<script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
pyside6渲染时:
with open("echarts.html", 'r', encoding="utf-8") as file:
file = file.read()
webEngineView.setHtml(file) # setHtml(网页结构字符串)
Load加载
# html引用时用 本地文件地址(绝对路径)
# 适合echarts文件使用
# html文件内 (必须把需要导入的js文件放于目录下)
<script src="D:/PySide/chart/echarts.js"></script>
<script src="D:/PySide/chart/axios.js"></script>
# pyside6文件内
webEngineView.load(QUrl("file:///D:/PySide/chart/echarts.html"))
-c (小写) 使用控制台
-w (小写) 使用窗口
pyinstaller -F -w 本地播放器.py --hidden-import PySide6.QtSvg --paths=C:\Users\20715\Desktop\PySide\venv\Lib\site-packages\shiboken6
pyinstaller -F -w --icon=播放器.ico 本地播放器.py --hidden-import PySide6.QtSvg --paths=C:\Users\20715\Desktop\PySide\venv\Lib\site-packages\shiboken6
# 思想
MVC架构
封装重构思想
分层思想
配置文件分离
# 文档
[pyside6 官方文档]: https://doc.qt.io/qtforpython/index.html
[pyqt6 第三方社区 强烈推荐]: https://www.pythonguis.com/pyqt6-tutorial/
[pyqt6 官方文档]: https://www.riverbankcomputing.com/static/Docs/PyQt6/
[qss文档]: https://doc.qt.io/qt-6.2/stylesheet-reference.html
# Pysider+ Echarts
## setHTML加载
html引用时用 链接文件地址
适合 pyecharts文件之间使用
在HTML文件中引用
pyside6渲染时:
with open(“echarts.html”, ‘r’, encoding=“utf-8”) as file:
file = file.read()
webEngineView.setHtml(file) # setHtml(网页结构字符串)
## Load加载
html引用时用 本地文件地址(绝对路径)
适合echarts文件使用
html文件内 (必须把需要导入的js文件放于目录下)
pyside6文件内
webEngineView.load(QUrl(“file:///D:/PySide/chart/echarts.html”))
更多推荐
所有评论(0)