使用Pyside进行Python图形界面开发

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.一个应用程序内可以显示多个顶级控件
   如果一个控件没有设置父级控件,则把它当顶级控件(窗口),并添加基本的特性(标题栏,标题,图标,最大,最小,关闭)
   子控件设置父控件  对象 = 子控件(父控件), 子控件无法修改父控件,父控件内将显示子控件(先显示父,再显示子)
   控件可以作为一个容器承载其它控件

应用程序流程

  1. 创建应用程序对象 app = QApplication(sys.argv)

  2. 创建控件 如: window = QWidget()

    设置控件(大小,尺寸,位置,样式,信号和槽…)

    展示控件 window.show()

  3. 应用程序的执行,进入消息循环 (监听用户的交互信息) app.exec()

  4. 主程序正常退出 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”))


物联沃分享整理
物联沃-IOTWORD物联网 » 使用Pyside进行Python图形界面开发

发表评论