【Maya】Qt(PySide) In Maya
【简单案例】
需求:在文本框输入数字,点击按钮,生成多个物体。
1.使用Qt Designer创建一个Widget,然后拖入Vertical Layout布局控件到窗口,接着将Push Button(点击按钮)、Label(标签)和Line Edit(行编辑框)控件放置到布局中。
2.按键盘F4,进入“编辑信号/槽”的状态。
按住鼠标左键,将“退出”按钮拖向界面空白处,在弹出的窗口中勾选“显示从QWidget继承的信号和槽”,然后将左边滚动框中的click()函数和右边滚动框中的close()连接。
此时可以看Qt Designer右下方的信号/槽编辑器中,显示了对应的发送接收信息。
*以上信号/槽的意思是:点击按钮后关闭窗口。
3.按键盘F3回到编辑窗口部件状态。Qt按钮有两种方式调用maya中的函数:动态属性和连接信号/槽的语句。
【动态属性】
点击选择“创建”按钮,在右边的属性编辑器中,点击右上方的“+”号,选择“字符串…”,
输入“+c”(如果后期调用的是MEL函数,则输入“c”)。动态属性右边的文本框是用户自定义的函数名。
但动态属性的方法仅用于外部加载Qt的UI文件的情况(UI和可执行函数分离),无法实时在maya的脚本编辑器中起作用,因此应使用连接信号/槽的语句进行。
【连接信号/槽】
通过带connect()函数的语句来设定UI和函数之间的联系。例如:
self.buttonSelectCurve.clicked.connect(SelectCurve)
4.保存为ui文件。
*.ui文件本质上是一个XML文本。
maya可使用多种方法加载UI,大致有这两种形式:
(1)maya脚本编辑器中,使用loadUI()函数从外部载入.ui文件或文本内容,然后showWindow()显示UI界面;
(2)将.ui文件转为.py的python文件,通过import或者添加文本内容到maya脚本编辑器,然后对UI类进行初始化加载。
加载外部文件和复制XML文本的方式,对于后续的代码调用来说都显得麻烦,因此个人推荐直接使用.py的代码文本进行编辑。
5.转换.ui文件为.py文件。有两种方法:使用maya安装路径下的mayapy.exe和pyside2-uic;在maya脚本编辑器中导入PySide2模块进行转换。我采用第二种方法,因为第一种有些繁琐,在OSX系统下的操作也会有所不同。
(方法1):
Win+R,在“运行”的文本框输入:cmd,开启windows的CMD命令提示符窗口,将maya安装路径下的mayapy.exe拖入cmd窗口,按下空格,继续拖入pyside2-uic,然后空格,输入“-o [py文件生成路径] [UI文件路径]”。
例如:
“C:\Program Files\Autodesk\Maya2019\bin\mayapy.exe” “C:\Program Files\Autodesk\Maya2019\bin\pyside2-uic” -o C:\Users\StarV\Documents\maya\2019\scripts\test.py C:\Users\StarV\Documents\maya\2019\scripts\test.ui
(方法2):
打开maya的脚本编辑器,输入以下代码:
import sys, pprint from pyside2uic import compileUi #uiPath为.ui文件的路径 uiPath=r'C:\Users\StarV\Documents\maya\2019\scripts\test.ui' #pyPath为转换为.py文件的存储路径 pyPath=r'C:\Users\StarV\Documents\maya\2019\scripts\test.py' pyFile = open(pyPath,'w') compileUi(uiPath,pyFile,False,4,False) pyFile.close()
6.将py文件直接拖入maya的脚本编辑器,得到清晰的PySide语法的代码内容。不过很不幸,带中文的.ui或者.py文件会出现字符串乱码。
在maya脚本编辑器中手动修正:重新输入中文字符,并添加编码转换语句。或者可以使用第三方脚本编辑器读取py文件的正确内容,添加编码转换语句后复制到maya脚本编辑器,例如VisualStudio。
*maya的python解释器默认是ascii编码(可通过print(sys.getdefaultencoding) 得知),因此要手动将中文字符串转换为UTF-8的编码
7.在顶部添加新的代码行。
from maya import OpenMayaUI as omui from shiboken2 import wrapInstance import sys import maya.cmds as py
8.在最下面添加初始化执行代码。
ptr=omui.MQtUtil.mainWindow() mayaMainWindow=wrapInstance(long(ptr),QtWidgets.QWidget) class MainWindow(QtWidgets.QMainWindow,Ui_Form): def __init__(self, parent = None): super(MainWindow, self).__init__(parent) self.setupUi(self) def main(): global win try: win.close() except: pass win=MainWindow(mayaMainWindow) win.show() if __name__ == "__main__": main()
9.全选代码,ctrl+Enter执行语句,可以看到窗口被正确创建了。
10.连接信号/槽。
步骤3时,如果创建了动态属性,它位于setupUi函数中(本例中不使用)。
在retranslateUi()函数中增加connect()语句。
self.pushButton.clicked.connect(createCube)
11.接着在Ui_Form类中编写函数createCube(self)的内容。
def createCube(self): mum=0 num=int(self.lineEdit.text()) for n in range(0,num): py.polyCube() py.move(1+n*2,r=True)
*类中函数带self参数是python的编写惯例
12.全选代码,ctrl+Enter执行语句。在生成窗口的文本框输入数字测试,例如10。点击“创建”按钮,得到10个并排的多边形立方体;点击“退出”按钮,关闭小窗口。