【Python】Pyside6简易版教程

文章目录

    • 一、安装及常见指令
      • 1.1 安装
      • 1.2 转换指令
    • 二、设计UI
      • 2.1 类别
        • 2.1.1 Spacer
        • 2.1.2 Buttons
        • 2.1.3 Input Widgets
        • 2.1.4 Display Widgets
        • 2.1.5 注意事项
      • 2.2 对象和属性
        • 2.2.1 对象
        • 2.2.2 属性
          • 2.2.2.1 属性的层级结构
          • 2.2.2.2 重要的属性
          • 2.2.2.3 插入图片
    • 三、回到Python
      • 3.1 给现有UI加新功能
        • 3.1.1 固定流程
        • 3.1.2 加入函数
        • 3.1.3 其他
      • 3.2 多线程
        • 3.2.1 承担主要功能的程序
        • 3.3.2 主程序py的更改
    • 四、结语

效果展示:


一、安装及常见指令


1.1 安装

pip install pyside6

然后去这儿添加进Pycharm:
请添加图片描述
注意exe的路径在你虚拟环境里面:
请添加图片描述

理论上讲啊,不管Pycharm单独下载pyside6也可以,有兴趣可以去研究。


1.2 转换指令

(1)ui -> py

注意路径要对,我是已经在这个文件夹里面了,所以直接输入相对路径即文件名来转换:

pyside6-uic faculty.ui -o faculty.py 

(2)qrc -> py

pyside6-rcc pics.qrc -o pics_rc.py

这两个指令有什么用后面就知道了。


二、设计UI

这部分我就不说多了,拖拉拽的东西,大家发挥创造力自己设计吧。


2.1 类别

类别太多了我也分不清有啥区别,简单说下一下:

layouts、containers都是容器,其他我后面会提到的都属于物件。容器里可以套容器,也可以存放物件。这种设计是为了让排版更方便。

这些东西之间有什么区别,自己拖出来看看就知道了。

反正大概来说,layouts排得更整齐,container更灵活。


2.1.1 Spacer

用来占空间的,因为你直接调长宽有的时候不方便,就拖点spacer出来产生空格,spacer调整长宽很方便,留白。


2.1.2 Buttons

按钮,看样子也知道分别是什么按钮了。按钮因为会和函数挂钩,算是非常重要的物件了。

如果你只需要一些简单的功能,那么可以在左下角这里添加,具体怎么用的摸索一下就行了:
请添加图片描述

但是如果你设计的函数非常复杂,就必须去python里写了,之后再说。


2.1.3 Input Widgets

所有的输入物件都在这里,也比较重要,因为会和传参挂钩,建议仔细研究。


2.1.4 Display Widgets

顾名思义是给人看的,你如果有一些东西是放在界面上当标识的,就从这里拖。一般是label。


2.1.5 注意事项

我这里只提醒1点,容器千万要一开始就设计好,后面再改排版布局非常麻烦,因为你所有物件都是往容器里拖的,容器一变啥都变了。不是很清楚有没有快速更换容器的方法。

2.2 对象和属性

这部分太多了,我也只选重要的讲一讲。


2.2.1 对象

请添加图片描述

这里可以看到层级结构,如果发现层级结构错了,即物品没有在你想要的容器里,赶紧改吧。

这里选择物件也很方便,有时UI设计重叠起来,或者是翻页设计,你从窗口那是点不到的,只有从这里点。

然后最重要的,记得改名,尽量所有对象都改个名!!不然之后进python人直接麻了,根本分不清谁是谁,比如你想指定某个button,结果全是button1,button2,button3。


2.2.2 属性


2.2.2.1 属性的层级结构

我这里选中了一个按钮,看看他的属性:
请添加图片描述
它的属性被分成了4大类,这是什么意思?我举个例子。

我是个中国成都人,如果把我的属性也分成四大类,就是:地球人属性、中国人属性、四川人属性、成都人属性。


2.2.2.2 重要的属性

首先所有属性你肯定都得看一遍吧,什么大小、字体啥的。

我这里选一些你平常用别人的软件觉得很自然,但自己设计可能会忽略的属性:

  • cursor:鼠标悬浮上去出现的手势;

  • toolTip:鼠标悬浮上去出现的提示性文字;

  • 然后最重要的styleSheet(直接对着物件右键点击“改变样式表”也可以):

    styleSheet使用的好像是前端语法?反正我建议直接搜索,然后抄,因为一点提示没有,根本不知道改写啥进去。

    下面这个是我给按钮用的样式,就和我们win10效果一样的,我讲一下:

请添加图片描述

QPushButton
                     
	{text-align : center;
                     
    font: bold;
                     
    padding: 6px;
                     
    height : 14px;
                     
    border-style: outset;
                     
    font : 20px;}
QPushButton:hover
                     
	{text-align : center;
                     
    background-color : #a8a8bd;
                     
    padding: 6px;
                     
    height : 14px;
                     
    font : 20px;}

上面表示我在定义按钮平常的格式,下面加了个:hover表示我在定义鼠标悬停上去的格式,因为我们知道win10你把鼠标放上去,他会有一个浅浅的变色效果,逼格很高。

请添加图片描述

然后如果是文本框物件,还可以选只读啥的,可以自己看看。


2.2.2.3 插入图片

如果你任何地方想使用图片,需要提前加进去。

按照箭头顺序点:
请添加图片描述

设计这里我差不多就说完了,真想往深了研究可以去下载别人做的pydracula,其实主要是学习他人的设计理念。


三、回到Python

使用之前提到的指令,将QT designer生成的ui文件转成py文件,同时将.qrc文件(这就是你插入的图片)转换为py文件。


3.1 给现有UI加新功能


3.1.1 固定流程

首先QT转好那个py文件(下称界面py)别动,新创建一个py,当作主程序(下称主程序py)。

然后在主程序那import,当然满足你程序主要功能的函数肯定也是单独一个py(下称功能py),然后import进来,也就是说你至少得有3个py:

from 界面py import Ui_MainWindow
from 功能py import xxx

然后继承这个Ui_MainWindow类:

class MyGui(QtWidgets.QMainWindow, Ui_MainWindow):
    total_args = Signal(tuple)

    def __init__(self):
        super().__init__()
        self.setupUi(self) # 固定
        self.retranslateUi(self) # 固定
        # 你想加的任何玩意儿
	
    def 任何玩意儿():
        pass
    
    
if __name__ == "__main__":
    import sys
    from PySide6 import QtWidgets

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = MyGui()

    MainWindow.show()  # 执行QMainWindow的show()方法,显示这个QMainWindow
    sys.exit(app.exec())  # 使用exit()或者点击关闭按钮退出QApplication

3.1.2 加入函数

接着说新的类里需要定义些什么函数,首先你的按钮相关的函数肯定得在这里定义了,不需要返回值,得不到返回值的。关键是怎么调用:

在类的构造函数那里,将你想绑定的一切玩意儿绑定了:

self.my_button.clicked.connect(self.my_func)

注意都是这种格式:self+对象名+clicked/toggled(反正就是一个用户动作,注意不带空格!!!)+connect+函数名。

注意如果你想传参怎么办:

self.my_button.clicked.connect(lambda: self.my_func(self.a, self.b))

3.1.3 其他

一般你想获得对象的某个属性,都可以通过self.对象名.函数名获取,比如.text(),获取输入框里的文本。


3.2 多线程

为什么需要多线程?因为如果只有单一线程,而运行程序又需要一定的时间,那么在等待时间就会显示未响应。

注意QT有自己的多线程设计,我没试过用Python原本的多线程能不能行。

接下来只说QT专属的多线程怎么用。


3.2.1 承担主要功能的程序

比如我设计个程序,功能是一点击按钮,他就帮我去网上搜刮各种图片然后保存下来。那么搜刮+保存的功能肯定要单独放进功能py。而且QT要求必须封装成一个类,而且得这么封装:

  • 首先必须继承QObject类,不然无法进行线程间通信
  • 然后使用Signal类定义好所有的功能py需要向主程序py传的信号
  • 最后使用self.信号对象.emit()方法来通信
class WorkThread(QObject):
    a = Signal(str)
    b = Signal(int)
    c = Signal(str)

    def __init__(self):
        super().__init__()

    def main(self, args):
        self.a.emit(你的信号)

功能py这边就完了。

当然,主程序py想往功能py传参也是用Signal和emit


3.3.2 主程序py的更改

def __init__(self):
    # 部署线程,可以放在构造函数结尾
    self.setup_thread()
   
def setup_thread():
    # 实例化QThread
    self.thread1 = QThread(self)
    # 实例化你在功能py写好的功能类
    self.work_thread = WorkThread()
    # 把你的功能对象放进刚创建的QThread对象里
    self.work_thread.moveToThread(self.thread1)
    # 把你在功能py那边创建好的Signal对象和这边的函数connect起来
    self.work_thread.a.connect(self.func_a)
    self.work_thread.b.connect(self.func_b)
    self.work_thread.c.connect(self.func_c)
    # 当然这边的Signal对象也要连到那边去
    self.total_args.connect(self.work_thread.main)

注意这些弄完了只是安排好了,还没实际开始运行,继续加这个:

def start_thread(self):
    # 线程启动
    self.thread1.start()
    # 获取参数
    total_args = (
        self.a_entry.text(),
        self.b_entry.text(),
        self.c_entry.text(),
        self.d_entry.text(),
    )
	# 发送信号
    self.total_args.emit(total_args)
    # 将按钮改为不可点击
    self.start_button.setDisabled(True)

最后那一步是防止程序已经开始运行了,别人还一直在点开始按钮,导致程序不断从头运行。


四、结语

这个Pyside6教程确实比较少,简单的太简单,复杂的动辄几十小时的视频。

这玩意儿我也只研究了4天,有很多细节、原理都不是很清楚,只是照搬,大家在使用过程中多自己体会吧!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年5月28日
下一篇 2023年5月28日

相关推荐