【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个并排的多边形立方体;点击“退出”按钮,关闭小窗口。

你也可能喜欢阅读这些文章:

0 评论
Inline Feedbacks
View all comments

Copyright© VIVICG 版权所有 粤ICP备 17111516号 粤公网安备 44011102000879