两种方法让 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了,希望能对大家有所帮助。

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML 3D场景可以通过两种方式进行加载: 1. 直接在QML文件中定义场景。这种方式适用于简单的场景,可以通过使用QML的3D元素(如 Box、Sphere、Cylinder 等)来创建3D模型和场景。 例如,以下代码创建了一个简单的场景,其中包含一个盒子和一个球体: ``` import Qt3D.Core 2.12 import Qt3D.Render 2.12 import Qt3D.Extras 2.12 Entity { id: rootEntity components: [ RenderSettings { activeFrameGraph: ForwardRenderer { clearColor: "transparent" } }, Camera { id: camera projectionType: CameraLens.PerspectiveProjection fieldOfView: 45 aspectRatio: 16/9 nearPlane : 0.1 farPlane : 1000.0 position: Qt.vector3d(0.0, 0.0, 40.0) upVector: Qt.vector3d(0.0, 1.0, 0.0) viewCenter: Qt.vector3d(0.0, 0.0, 0.0) } ] BoxMesh { id: boxMesh width: 5.0 height: 5.0 depth: 5.0 } SphereMesh { id: sphereMesh radius: 2.0 } Transform { id: boxTransform translation: Qt.vector3d(-10.0, 0.0, 0.0) } Transform { id: sphereTransform translation: Qt.vector3d(10.0, 0.0, 0.0) } Material { id: material effect: PhongMaterial { ambient: Qt.rgba(0.1, 0.1, 0.1, 1.0) diffuse: Qt.rgba(1.0, 1.0, 1.0, 1.0) specular: Qt.rgba(0.3, 0.3, 0.3, 1.0) shininess: 100.0 } } PhongMaterial { id: material2 ambient: Qt.rgba(0.1, 0.1, 0.1, 1.0) diffuse: Qt.rgba(1.0, 1.0, 1.0, 1.0) specular: Qt.rgba(0.3, 0.3, 0.3, 1.0) shininess: 100.0 } Entity { id: boxEntity components: [ boxMesh, material, boxTransform ] } Entity { id: sphereEntity components: [ sphereMesh, material2, sphereTransform ] } } ``` 2. 通过使用Qt3DSceneLoader加载外部3D模型文件。这种方式适用于复杂的场景,可以使用专业的3D建模软件(如Blender、Maya等)创建模型和场景,并将其导出为支持Qt3D的格式(如.gltf、.obj等)。 例如,以下代码使用Qt3DSceneLoader加载一个外部的.gltf文件: ``` import Qt3D.Core 2.12 import Qt3D.Render 2.12 import Qt3D.Extras 2.12 Entity { id: rootEntity components: [ RenderSettings { activeFrameGraph: ForwardRenderer { clearColor: "transparent" } }, Camera { id: camera projectionType: CameraLens.PerspectiveProjection fieldOfView: 45 aspectRatio: 16/9 nearPlane : 0.1 farPlane : 1000.0 position: Qt.vector3d(0.0, 0.0, 40.0) upVector: Qt.vector3d(0.0, 1.0, 0.0) viewCenter: Qt.vector3d(0.0, 0.0, 0.0) } ] Entity { id: externalEntity Qt3DSceneLoader { id: loader source: "path/to/external/file.gltf" } onStatusChanged: { if (loader.status === Qt3DRender.Qt3DRender.Loaded) { rootEntity.addComponent(externalEntity) } } } } ``` 以上是两种加载QML 3D场景的方式,您可以根据自己的需求进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值