一、什么是PyQt
简单来说,PyQt就是用Python重构的Qt,一个强大的,创建跨平台GUI(Graphical User Interface)的工具包。开发者为Phil Thompson
。
二、PySide与PyQt
PyQt和PySide都是基于Python语言对Qt的实现,PyQt的推出时间要比PySide早些,功能也相对更强大,但是,PyQt采用的是GPLv3许可证,如果你在公司使用,可能就会出问题。
相较之下,PySide问世较晚,但确是Qt的亲儿子,采用LGPL协议发布,在未来,极有可能迸发出超过PyQt的影响力。
三、PySide6的安装与使用
直接pip install pyside6
即可,安装成功后,找到所在路径,例如:
..\anaconda\Lib\site-packages\PySide6
我们接下来需要设置外部工具,在PyCharm中,打开如下所示的选项。
在添加页面,我们主要需要导入三个外部工具,分别是;
- Qt Designer:所见即所得式的页面设计工具
- UIC:将Qt Designer生成的.ui文件转换为.py文件
- RCC:将编写的.qrc资源转换为.py文件
1️⃣ Qt_Designer
最新版的这三个外部工具都在\PySide6\
目录下,不需要进入\Pyside6\script\
查找。
填写参数:
- Arguments:
$FilePath$
- Working directory:
$FileDir$
2️⃣ UIC
同理,这里的参数填写为:
-
Arguments:
$$FileName$ -o ui_$FileNameWithoutExtension$.py$
-
Working directory:
$FileDir$
3️⃣ RCC
这里的参数填写为:
-
Arguments:
$$FileName$ -o $FileNameWithoutExtension$_rc.py $
-
Working directory:
$FileDir$
不出意外的话,我们可以在这里看到我们的工具:
或是右键某个程序,也可以找到我们安装好的工具。
四、PySide6的核心模块
PySide6支持大量的模块,这些模块可以提供功能强大的开发支持。
其中,核心模块有三个:
模块名 | 描述 |
---|---|
QtCore | 提供核心的非GUI功能,如信号和槽、属性、项目模型的基类、序列化等。 |
QtGui | 扩展QtCore的GUI功能:事件,窗口和屏幕,OpenGL和基于光栅的2D绘画,以及图像。 |
QtWidgets | 为应用程序提供可随时使用的小组件,包括用于UI的图形元素。 |
其他主要模块如下:
模块名 |
---|
QtBluetooth |
QtCharts |
QtConcurrent |
QtDataVisualization |
QtDBus |
QtDesigner |
QtHelp |
Qt Multimedia |
Qt Multimedia Widgets |
QtNetwork |
Qt Network Authorization |
QtNfc |
QtOpenGL |
Qt OpenGL Widgets |
QtPDF |
Qt PDF Widgets |
QTQml |
其他模块可以查看官方文档:https://doc.qt.io/qtforpython/modules.html
五、快速构建一个PySide6可视化程序
我们现在尝试用PySide6来说Hello World
吧!
之前说的那三个核心模块,其实在每个PySide项目中都可以提前选择导入,反正即使用不到也不亏。
项目目标:制定一个可以随机用不同语言说“你好世界“的可视化程序
明确目标后,我们就要导入模块了。
import sys # sys在这里主要用于控制进程
import random # random在这里用于选择随机项
from PySide6 import QtCore,QtWidgets,QtGui # 核心模块
接着,我们需要创建一个窗口。为了方便使用,这里我们写成一个组件类。
class MyWidget(QtWidgets.QWidget):
# 选择继承自QWidgets.QWidget,这样就能当个小组件用啦
def __init__(self):
super().__init__()
为了实现语言切换,我们需要一个触发器,这里选择的是一个PushButton
,这个PushButton
有一个触发事件。
self.button=QtWidgets.QPushButton("Click me!")
# 继承自组件类QPushButton(text)
self.button.clicked.connect(self.magic)
# 设置点击时间, 通过connect与槽函数连接起来
@QtCore.Slot() # 表明这是一个槽函数
def magic(self):
pass
好了,然后我们需要能够显示的组件,这里选用的是QLabel
:
self.text=QtWidgets.QLabel("Hello World", alignment=QtCore.Qt.AlignCenter)
# 设置我们的随机框
self.hello=["Hallo Welt", "Hei maailma", "Hola Mundo", "Привет мир","你好"]
虽然我们现在搞好了组件,但是我们还需要对组件进行布局,让他看起来更美观。这里选择QVBoxLayout
进行布局:
self.layout = QtWidgets.QVBoxLayout(self)
# 传递自身,表示本组件采用的布局方式
self.layout.addWidget(self.text) # 添加组件
self.layout.addWidget(self.button)
别忘了,还有我们的点击事件,我们现在可以将其完善了:
@QtCore.Slot() # 表明这是一个槽函数
def magic(self):
self.text.setText(random.choice(self.hello))
这样,我们就做好一个小组件啦!
但是这个组件并不会自己显示出来,我们需要创建一个应用程序来承载这个组件。
app = QtWidgets.QApplication([]) # 创建一个app
sys.exit(app.exec()) # 设置app的退出事件
接着就是组件的显示啦:
widget = MyWidget()
widget.resize(800, 600)
widget.show()
最终结果如下:
完整代码如下:
import sys
import random
from PySide6 import QtCore,QtWidgets,QtGui
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.hello=["Hallo Welt", "Hei maailma", "Hola Mundo", "Привет мир","你好"]
self.button=QtWidgets.QPushButton("Click me!")
self.text=QtWidgets.QLabel("Hello World",
alignment=QtCore.Qt.AlignCenter)
self.layout=QtWidgets.QVBoxLayout(self)
self.layout.addWidget(self.text)
self.layout.addWidget(self.button)
self.button.clicked.connect(self.magic)
@QtCore.Slot()
def magic(self):
self.text.setText(random.choice(self.hello))
if __name__ == '__main__':
app=QtWidgets.QApplication([])
widge=MyWidget()
widge.setWindowTitle("Say Hello")
widge.resize(800,600)
widge.show()
sys.exit(app.exec())