1. 程式人生 > >兩種方法讓 Maya 載入使用Qt Designer 所建立的ui檔案

兩種方法讓 Maya 載入使用Qt Designer 所建立的ui檔案

雖然我寫指令碼還不是很熟練但是總是在沒有UI的純程式碼下除錯真的很煩。選擇這個執行一下,再選擇這個執行一下,最後按順序選擇這幾個再執行一下。。。。。過了幾天自己好像都看不太懂了。還是學習一下UI的寫法吧。

maya建立UI可以自己純用程式碼來寫,也可以藉助一個叫Qt Designer圖形介面來建立一個ui檔案供Maya載入後使用。作為我這種半吊子來說,使用圖形介面就是相當友好上手快捷的事情了。Qt Designer在比較高版本的maya中是自帶的,位置在maya安裝目錄下bin目錄中的designer.exe就是了。如果打不開可以參考我上一篇文章,希望能有所幫助。如果實在打不開也可以下載一個Qt Creator使用裡面的desigener也是一樣的。

在建立完成一個.ui檔案以後呢就需要將檔案載入進入maya,在這裡載入就有兩種方法。

第一種是使用QUiLoder().load()直接將ui檔案載入進入。

  1. 使用designer製作一個簡單的UI,放入maya可以的讀取到的指令碼資料夾下。(比如我的文件下maya/script下)
  2. 載入進入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的檔案形式。通過繼承的方式載入進入

  1. 編譯.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"))
    
    
  2. 把編譯好的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了,希望能對大家有所幫助。