Pyside2 入门篇:一
前言
这篇文章是写给初学者的PySide指南,同时也是学习过程中的一些总结,基本是面向maya用户。PySide2和PySide没有特别大的区别,所以后续我就统称为PySide。文章中我会在Maya中使用Pyside,但是对于不是Maya用户的的人,如果你读了这个文章,也希望对从未接触过 PySide 编程的人也有所帮助。
基本概念
什么是Pyside
PySide是跨平台的图形使用界面框架Qt的Python版本。提供和PyQt类似的功能,并兼容API。但与PyQt不同处为使用LGPL许可。他是一个专门用于创建GUI的库,可以在Python中使用,也可以在不同的操作系统上使用(linux&windows)。此外大多数的DCC软件都使用它,比如Maya、houdini和Blender等。Pyside基于QT的C++框架。
Pyside学起来简单
Pyside的写法相对简单,官方文档也有大量案例,善用谷歌与Chatgpt可以极大的提高学习效率。
使用Pyside的好处
- 可以在其他软件或平台上使用
- 可以创建模板便于重复使用
- 构建好看的图形界面优化用户体验
Pyside与PyQt的区别
PySide和PyQt的主要区别是license的不同,还有一些PyQt有PySide没有的功能,但是如果没有特殊原因还是推荐使用PySide。license的区别,Pyside的商用限制比较宽松,PyQt的限制则比较严格。如果你想详细了解他们的区别可以在这里区别详细了解。
第一个按钮
打开脚本编辑器,如果你看到的脚本编辑器与我不同,那是因为我是用了Charcoal Editor 2插件。这并不是重点
在没有这个插件的情况下 脚本编辑器的界面是这样的
在脚本编辑器中输入import PySide2点击下面的按钮执行代码
如果执行成功,上面的文本框中就会 import PySide2,如果你拼写有错就会得到一句报错
创建一个按钮
1 | from PySide2 import QtWidgets |
复制上面的代码粘贴到脚本编辑器中你就得到了一个按钮,但是当你再点击Maya主窗口时,你会发现按钮不见了,这是因为它被Maya的MayaWindow盖住。后面我们会讲到如何解决这个问题。
第一个界面
我再这里贴一段Qt_for_Python_Tutorial_HelloWorld的示例代码
1 | import sys |
将他粘贴到脚本编辑器中运行会给我们一个报错: A QApplication instance already exists. 已经存在一个桌面应用程序。
这段代码的意思是创建一个QApplication 作为 Qt 应用程序的主程序,但在Maya的情况下,Maya本身就是一个应用程序并且已经在运行,因此我们不能创建新的主应用程序QApplication(sys.argv)。所以需要修改代码为QApplication.instance() 才可以成功执行并得到下面的界面。
1 | import sys |
或者可以删除导入QApplication的部分执行,直接显示小部件
1 | from PySide2.QtWidgets import QLabel |
QLabel 是一个可以显示文本和图像的小部件。
什么是小部件(Widgets)
小部件是Pyside UI 的部件单元,使用Pyside创建图形界面的主要元素。在Pyside中通过组合与修改小部件来构建UI。
第一个窗口
在Maya中,脚本和插件通常是通过窗口来对用户进行更好的图形交互,如果只是依赖代码的话,对于美术制作人员或者不懂代码的人将会十分的不友好,所以开始创建我们的第一个窗口吧。
1 | from PySide2 import QtWidgets |
from PySide2 import QtWidgets 在这里做必要的导入。基本的 GUI 小部件可以在 QtWidgets中找到。
widget = QtWidgets.QWidget() QWidget 类是所有图形界面对象的基类。未嵌入父小部件的小部件称为窗口
widget.resize(300, 200) resize() 方法调整小部件的大小。我们将宽度更改为300px,将高度更改为 200px。
widget.setWindowTitle(“First Window”) 可以在此处设置窗口的标题。如果未设置标题,则标题将为windowFilePath,因此对于 Maya,它将Maya-<version>
被命名为类似
创建一个带按钮的窗口
这次我们会接触到类这个概念,熟悉python或其他语言的人对这个概念并不陌生。因为Pyside基本都是用类来构建UI,所以之后的代码我们都会用类来构建。
1 | from PySide2 import QtWidgets |
class Example(QtWidgets.QWidget): 这个例子继承自一个叫QWidget的类,继承了一个叫QWidget的类并创建了一个新的类叫Example,继承说的就是这个意思。并且在一个类中定义__init__和create_ui方法,但是在我解释这个之前, 说明一下self 是类本身,即名为Example 的类。
def __init__(self, parent=None, *args, **kwargs): 它是在初始化时创建的,用于定义UI。总是最先调用的。
def create_ui(self): 主要包括了UI的实现代码。具体含义标注在代码中
信号与槽
Qt的功能定义了重要的信号和槽,基本上可以用来实现widget之间或者widget和你自己的Python代码之间的通信,这个时候有一个按钮有一个代码,当你按下close按钮时 窗口就会关闭
创建带菜单的界面
这里会介绍应用程序中使用的菜单、工具栏与状态栏
菜单是放置在菜单栏上的一组命令,工具栏上有应用程序中常用命令的按钮,状态栏则是显示状态信息的小部件。
1 | from PySide2 import QtWidgets |
上文中使用了QWidget,为什么这次中使用了QMainWindow?
顾名思义,QMainWindow 提供了一个主窗口,可以轻松创建带有状态栏、工具栏和菜单栏的经典应用程序。在构建PySide UI 时,基本流程是准备一个 QMainWindow 并嵌入 QWidgets、QPushButtons 等小部件.。在那个 QMainWindow 中创建UI。
QMenu由一系列操作项组成,可以使用 addAction()、addActions()、insertAction() 函数添加操作
可以通过创建QAction来跨多个菜单和工具栏使用它,而无需编写QPushButton或回调。在上面的示例中triggered.connect,该操作由此外触发,因为Ctrl + G设置了快捷方式,运行本例时可以用Ctrl+G关闭窗口
**self.menuBar()**为自己创建一个菜单栏,即 QMainWindow,返回一个 QMenuBar并向菜单栏添加菜单
**self.addToolBar()**为自己创建一个工具栏,即 QMainWindow,返回一个QToolBar并向工具栏添加Action
**self.statusBar()**在第一次调用中创建一个状态栏并返回QStatusBar即 QMainWindow 的状态栏showMessage() 在状态栏中显示一条消息
后记
第一篇入门文章中主要说了一些Pyside的概念与简单应用,在下一篇文章中会主要介绍 信号与槽 布局 等概念,帮助读者一步步创建出一个maya的脚本或插件的图形界面模板。讲出来是为了帮助自己更好的理解和沉淀,若有错误请及时指出。_(:з」∠)_