pip install pyside6
然后去这儿添加进Pycharm:
注意exe的路径在你虚拟环境里面:
理论上讲啊,不管Pycharm单独下载pyside6也可以,有兴趣可以去研究。
(1)ui -> py
注意路径要对,我是已经在这个文件夹里面了,所以直接输入相对路径即文件名来转换:
pyside6-uic faculty.ui -o faculty.py
(2)qrc -> py
pyside6-rcc pics.qrc -o pics_rc.py
这两个指令有什么用后面就知道了。
这部分我就不说多了,拖拉拽的东西,大家发挥创造力自己设计吧。
类别太多了我也分不清有啥区别,简单说下一下:
layouts、containers都是容器,其他我后面会提到的都属于物件。容器里可以套容器,也可以存放物件。这种设计是为了让排版更方便。
这些东西之间有什么区别,自己拖出来看看就知道了。
反正大概来说,layouts排得更整齐,container更灵活。
用来占空间的,因为你直接调长宽有的时候不方便,就拖点spacer出来产生空格,spacer调整长宽很方便,留白。
按钮,看样子也知道分别是什么按钮了。按钮因为会和函数挂钩,算是非常重要的物件了。
如果你只需要一些简单的功能,那么可以在左下角这里添加,具体怎么用的摸索一下就行了:
但是如果你设计的函数非常复杂,就必须去python里写了,之后再说。
所有的输入物件都在这里,也比较重要,因为会和传参挂钩,建议仔细研究。
顾名思义是给人看的,你如果有一些东西是放在界面上当标识的,就从这里拖。一般是label。
我这里只提醒1点,容器千万要一开始就设计好,后面再改排版布局非常麻烦,因为你所有物件都是往容器里拖的,容器一变啥都变了。不是很清楚有没有快速更换容器的方法。
这部分太多了,我也只选重要的讲一讲。
这里可以看到层级结构,如果发现层级结构错了,即物品没有在你想要的容器里,赶紧改吧。
这里选择物件也很方便,有时UI设计重叠起来,或者是翻页设计,你从窗口那是点不到的,只有从这里点。
然后最重要的,记得改名,尽量所有对象都改个名!!不然之后进python人直接麻了,根本分不清谁是谁,比如你想指定某个button,结果全是button1,button2,button3。
我这里选中了一个按钮,看看他的属性:
它的属性被分成了4大类,这是什么意思?我举个例子。
我是个中国成都人,如果把我的属性也分成四大类,就是:地球人属性、中国人属性、四川人属性、成都人属性。
首先所有属性你肯定都得看一遍吧,什么大小、字体啥的。
我这里选一些你平常用别人的软件觉得很自然,但自己设计可能会忽略的属性:
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你把鼠标放上去,他会有一个浅浅的变色效果,逼格很高。
然后如果是文本框物件,还可以选只读啥的,可以自己看看。
如果你任何地方想使用图片,需要提前加进去。
设计这里我差不多就说完了,真想往深了研究可以去下载别人做的pydracula,其实主要是学习他人的设计理念。
使用之前提到的指令,将QT designer生成的ui文件转成py文件,同时将.qrc文件(这就是你插入的图片)转换为py文件。
首先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
接着说新的类里需要定义些什么函数,首先你的按钮相关的函数肯定得在这里定义了,不需要返回值,得不到返回值的。关键是怎么调用:
在类的构造函数那里,将你想绑定的一切玩意儿绑定了:
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))
一般你想获得对象的某个属性,都可以通过self.对象名.函数名获取,比如.text(),获取输入框里的文本。
为什么需要多线程?因为如果只有单一线程,而运行程序又需要一定的时间,那么在等待时间就会显示未响应。
注意QT有自己的多线程设计,我没试过用Python原本的多线程能不能行。
接下来只说QT专属的多线程怎么用。
比如我设计个程序,功能是一点击按钮,他就帮我去网上搜刮各种图片然后保存下来。那么搜刮+保存的功能肯定要单独放进功能py。而且QT要求必须封装成一个类,而且得这么封装:
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
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天,有很多细节、原理都不是很清楚,只是照搬,大家在使用过程中多自己体会吧!