【Python】Pyside6简易版教程

news2025/8/7 16:39:10

文章目录

    • 一、安装及常见指令
      • 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天,有很多细节、原理都不是很清楚,只是照搬,大家在使用过程中多自己体会吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公众号配置调试“errMsg“:“config:fail,invalid signature

一:登陆“微信公众平台”,查看“ip白名单是否设置” ,之前是个可选项,现在是必须设置 二: 1:获取access_token微信公众平台接口调试工具https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=%E5%9F%BA%E7%A1%80%E6%94%AF%E6%8C%81&form=%E8%8E%B…

JUC03-volatile、CAS及并发原子类

一、 Volatile Volatile可以用来修饰成员变量和静态成员变量,保证可见性、有序性 可见性:保证volatile修饰的变量每次读取都会从主从中进行读取而不是cpu缓存 有序性:对Volatile修饰变量进行写操作时,会在该操作后加上写屏障&…

【附源码】计算机毕业设计JAVA校园教育服务平台

【附源码】计算机毕业设计JAVA校园教育服务平台 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA my…

【FLASH存储器系列十】Nand Flash芯片使用指导之一

目录 1.1 芯片简介 1.2 功能框图 1.3 存储结构 1.4 信号定义 1.5 双平面(plane)操作 1.6 Die间交错操作 1.7 错误管理 今天以MT29F8G08AJADAWP芯片为例,说明nand flash的操作方法。 1.1 芯片简介 这是一款镁光的容量8Gb,总…

功能上新 | Magic Data Annotator智能出行舱内舱外全场景标注

随着人工智能、互联网、大数据、5G等新技术应用和汽车产业变革的蓬勃兴起,智能汽车已成为汽车产业发展的重要战略方向。目前,智能驾驶已经成为目前车企营销的核心竞争力。在人车协作过程中,智能汽车最重要的功能就是车舱内外视觉功能&#xf…

Redis入门

目录 NoSQL概述 什么是NoSQL? 为什么要用NoSQL? NoSQL 的特点 NoSQL的四大分类 Redis入门 概述 基础知识 五大数据类型 Redis——Key String(字符串) List(列表) Set(集合) Hash(哈希) Zset(有序集合) 三种特殊数据类型 Geospatial 地理…

冯诺依曼体系结构、操作系统的认识

目录前言1️⃣ 冯诺依曼体系结构1.1 基本概念1.2 存储器的作用1.3 CPU的指令集1.4 实例2️⃣ 操作系统2.1 概念2.2 如何理解“管理”2.2.1 管理的本质2.2.2 管理的方法2.3 系统调用总结前言 💭本文是对计算机底层学习的初步认识的知识铺垫,初步了解冯诺依…

高等数值计算方法学习笔记第4章第二部分【数值积分(数值微分)】

高等数值计算方法学习笔记第4章第二部分【数值积分(数值微分)】四、龙贝格求积公式(第三次课)1.梯形法的递推化 (变步长求积法)2.龙贝格算法五、高斯求积公式1.一般理论(1定义1例题)2.构造高斯求积公式方法(二&#xf…

0098 蓝桥杯真题01

import java.util.Calendar; /* * 世纪末的星期 * 曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会… * 有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 于是&…

php socket说明 stream流说明

socket说明 我们都知道通过IP,端口等可以实现两台机器之间的数据互通,但具体要怎么操作,系统给我们提供了socket接口,通过调用socket函数就可以实现互通。php的socket扩展和C本身的非常相似,如果找不到php相关的资料&…

[附源码]SSM计算机毕业设计中小学微课学习系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【C++】日期类的实现

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉前言&…

MySQL8.0优化 - 事务的隔离级别

文章目录学习资料事务的隔离级别脏读、不可重复读、幻读脏读(Dirty Read)不可重复读(Non-Repeatable Read)幻读(Phantom)SQL中的四种隔离级别读未提交(READ UNCOMMITTED)读已提交&am…

北京化工大学数据结构2022/11/17作业 题解

(7条消息) 食用前须知(阅读并同意后在食用其他部分)_lxrrrrrrrr的博客-CSDN博客 看完进来哈 目录 问题 A: 邻接矩阵存储的图,节点的出度和入度计算(附加代码模式) 问题 B: 算法7-12:有向无环图的拓扑排序 问题 C: 有向图是否存…

剪枝算法:通过网络瘦身学习高效卷积网络

摘要 原文链接:https://arxiv.org/abs/1708.06519 深度卷积神经网络(CNNs)在现实世界中的应用很大程度上受到其高计算成本的阻碍。在本文中,我们提出了一种新的cnn学习方案,以同时减小模型的尺寸;2)减少运行时内存占用;3)在不影响精度的前…

[附源码]java毕业设计企业职工福利发放管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

WPF TreeView数据回填

这一期简单的说一下这个TreeView的数据回填, 上图是查询类型数据 上图是服务端的数据传递, 从数据库对应的查询出的数据传到服务端然后再传到客户端 上图就是在客户端后台启用刷新中的代码, DefaultView 获取自定义的视图 ItemsSource 获取…

如何在两个相关泛型类之间创建类似子类型的关系

本文正在参加「金石计划 . 瓜分6万现金大奖」 哈喽大家好,我是阿Q! 事情是这个样子的...... 对话中的截图如下: 看了阿Q的解释,你是否也和“马小跳”一样存在疑问呢?请往👇看 我们都知道在java中&#x…

领英高效开发客户方法(建议收藏)

领英高效开发客户 有效使用linkedIn领英,充分利用其人脉来为我们外贸人开发客户服务,我们也能获得外贸业-务更多更好机遇,扩大自己的外贸人脉圈。 在这里和大家分享一下,如何利用好领英linkedIn,轻松免-费地开发国外客…

深度学习入门(四十二)计算机视觉——目标检测和边界框

深度学习入门(四十二)计算机视觉——目标检测和边界框前言计算机视觉——目标检测和边界框课件图片分类和目标检测边缘框目标检测数据集总结教材1 边界框2 小结前言 核心内容来自博客链接1博客连接2希望大家多多支持作者 本文记录用,防止遗忘…