虽然我写脚本还不是很熟练但是总是在没有UI的纯代码下调试真的很烦。选择这个运行一下,再选择这个运行一下,最后按顺序选择这几个再运行一下。。。。。过了几天自己好像都看不太懂了。还是学习一下UI的写法吧。
maya创建UI可以自己纯用代码来写,也可以借助一个叫Qt Designer图形界面来创建一个ui文件供Maya加载后使用。作为我这种半吊子来说,使用图形界面就是相当友好上手快捷的事情了。Qt Designer在比较高版本的maya中是自带的,位置在maya安装目录下bin目录中的designer.exe就是了。如果打不开可以参考我上一篇文章,希望能有所帮助。如果实在打不开也可以下载一个Qt Creator使用里面的desigener也是一样的。
在创建完成一个.ui文件以后呢就需要将文件加载进入maya,在这里加载就有两种方法。
第一种是使用QUiLoder().load()直接将ui文件加载进入。
- 使用designer制作一个简单的UI,放入maya可以的读取到的脚本文件夹下。(比如我的文档下maya/script下)
- 加载进入maya
#-*-coding:utf-8-*- from maya import cmds from maya import mel from maya import OpenMayaUI as omui from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * from PySide2.QtUiTools import * #如果不加载QtUiTools就不能使用QUiLoader() # from Qt import QtCore, QtGui, QtWidgets, QtUiTools from shiboken2 import wrapInstance import os.path mayaMainWindowPtr = omui.MQtUtil.mainWindow() mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QWidget) #获得Maya主窗口 class CreateUI(QWidget): def __init__(self, *args, **kwargs): super(CreateUI, self).__init__(*args, **kwargs) self.setParent(mayaMainWindow)#将新窗口设置为maya的子级 self.setWindowFlags(Qt.Window) self.initUI() def initUI(self): loader = QUiLoader() # currentDir = os.path.dirname(__file__)#如果是import到maya中就可以的使用方法获得路径 currentDir = 'C:\Users\Work20180330\Documents\maya\scripts' file = QFile(currentDir + "/MyFirstQt.ui")#这个方法要使用绝对路径 file.open(QFile.ReadOnly) file.open self.ui = loader.load(file, parentWidget=self)#初始化 file.close() self.ui.btnPrint.clicked.connect(self.Print) def Print(self): nText = self.ui.printText.text() print nText self.ui.printText.clear() def main(): ui = CreateUI() ui.show() print 'run MyFirstQt' return ui if __name__ == '__main__': main()
第二种方法就是将制作的.ui文件通过pyuic5编译成.py的文件形式。通过继承的方式加载进入
- 编译.ui文件时,先打开命令提示符,,输入命令pyuic5 (ui文件的绝对路径) –o (输出py文件的绝对路径)并执行(如果使用的是pyqt4的话,前面输入的就应当是pyuic4),执行完成后会看到一个python脚本文件。
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'C:\Users\Work20180330\Documents\maya\scripts\MyFirstQt.ui' # # Created by: PyQt5 UI code generator 5.11.2 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MyFirstQt(object): def setupUi(self, MyFirstQt): MyFirstQt.setObjectName("MyFirstQt") MyFirstQt.resize(200, 200) self.printText = QtWidgets.QLineEdit(MyFirstQt) self.printText.setGeometry(QtCore.QRect(30, 20, 141, 20)) self.printText.setObjectName("printText") self.btnPrint = QtWidgets.QPushButton(MyFirstQt) self.btnPrint.setGeometry(QtCore.QRect(60, 80, 75, 23)) self.btnPrint.setObjectName("btnPrint") self.retranslateUi(MyFirstQt) QtCore.QMetaObject.connectSlotsByName(MyFirstQt) def retranslateUi(self, MyFirstQt): _translate = QtCore.QCoreApplication.translate MyFirstQt.setWindowTitle(_translate("MyFirstQt", "Form")) self.btnPrint.setText(_translate("MyFirstQt", "Print"))
- 把编译好的py文件放入maya可以的读取到的脚本文件夹下,使用impor导入编译好的文件。新建类继承UI的类。
#-*-coding:utf-8-*- from maya import OpenMayaUI as omui from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * from shiboken2 import wrapInstance import MyFirstQtWindow #加载编译成Py的.ui文件 mayaMainWindowPtr = omui.MQtUtil.mainWindow() mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QWidget)#获得Maya主窗口 class MainWindow(QMainWindow,MyFirstQtWindow.Ui_MyFirstQt):#继承编译好的.py类 def __init__(self,*args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.setParent(mayaMainWindow)#将新窗口设置为maya的子级 self.setWindowFlags(Qt.Window) self.setupUi(self)#运行父类初始化方法 self.connectSignals() def connectSignals(self): self.btnPrint.clicked.connect(self.Print) def Print(self): nText = self.printText.text() print nText self.printText.clear() def main(): ui = MainWindow() ui.show() print 'run MyFirstQtNext' return ui if __name__ == '__main__': main()
通过上述两种方法就可以将designer制作的ui文件导入maya了,希望能对大家有所帮助。