`
schi
  • 浏览: 201510 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Working with Qt maya2011

阅读更多
  maya2011使用了Qt框架,10年来几乎一成不变的maya界面,现今变成了黑糊糊的界面,虽然只是随便的玩弄了一下,感觉比以前的界面好多了。
  Ok,感叹到此为止,进入我们今天的话题"Working with Qt",主要介绍如何使用Qt的Designer来给maya制作UI,有了Designer不管你是程序员还是非程序员,都能轻松给maya制作UI。
  先给出Qt的下载地址,Maya 2011 使用的是 Qt 4.5,版本4.5.X的X是无关紧要的,如果你只是用来制作UI我认为版本应该不重要,但如果你是想要写基于Qt的maya插件,那版本就十分重要了。

Win
ftp://ftp.qt.nokia.com/qt/source/qt-win-opensource-4.5.3-mingw.exe

Linux 请参考http://download.autodesk.com/us/maya/2011help/files/Setting_up_your_build_environment_Linux_environments_32bit_and_64bit.htm

Mac
ftp://ftp.qt.nokia.com/qt/source/qt-mac-cocoa-opensource-4.5.3.dmg

  安装好Qt后就可以使用Designer了,在开始制作UI前我简单的给你们说一下maya是如何读取.ui文件的。虽然maya2011使用了Qt框架,但据我所知maya不是像Qt那样的读取.ui文件,而是通过loadUI命令来读取的,再通过MQtUtil类来进行(已识别的)maya的脚本和Qt的插件(widgets)的连接来完成的,简单的说就是通过loadUI命令读取.ui文件,将读取的内容给MQtUtil进行过滤,如果能识别就会转化成对应mel命令来实现UI。所以虽然你使用Designer制作的UI,实际用起来还是基于mel的UI。可见maya还是在力挺mel啊,都撑了10年了。
  打开Designer,我们要开始制作UI了,选择"Dialog without Buttons",点击"Create"



  给窗口一个独一无二的名称,如"QtDialog",就像你在用mel写UI时一样给窗口一个独一无二的名称是一个很安全的做法,这样你以后就能用mel后python来对其进行访问了,如果你像更改窗口的标题可以在"windowTitle"那里更改



  加入我们需要的控件两个"Label",一个"Combo Box"和一个"Line Edit",在Widget Box中找到后直接拖到窗口中就行



  双击"Label"就可以编辑它们的显示内容,因为我们不需要对其进行访问,所以不需要给它们一个独一无二的名称,你也可以编辑它们的字体等属性,但"Combo Box"和"Line Edit"就需要了,如图Object列是它们在maya里的名称,Class是控件的类型,我把"Combo Box"命名为"objTypeOM","OM"是optionMenu的缩写,这样命名是因为"Combo Box"就是optionMenu,可以推论"Line Edit"就是textField,所以我命名为"objNameTF"



  右键"Combo Box"来编辑它的项目



  并加入"Sphere","Cube","Cylinder","Cone","Plane"



  现在我们来添加两个按钮,也许你会问为什么不在一开始就选择一个有按钮的UI来创建呢,原因很简单,Qt里默认的带按钮的窗口都是使用QDialogButtonBox插件(widgets),这是maya不能识别的,因为mel没有按钮组,只有按钮(button)命令,所以我们只能使用PushButton,双击就能更改显示名称



  到这里我们的UI就完成了,接下来就是对相应的控件进行命令绑定,当objTypeOM(Combo Box)的项目发生变化时,我希望objNameTF(Line Edit)里的内容是objTypeOM所选的项目的名称,mel_changeType()就是用来完成这些的命令
global proc mel_changeType()
{
    string $objType = `optionMenu -q -v objTypeOM`;
    textField -e -tx $objType objNameTF;
}

   而当objNameTF里的内容是objTypeOM中的项目名称时,按下回车后objTypeOM会把该项目设置为当前所选的项目,我们需要mel_changeName()
global proc mel_changeName()
{
    string $objTypes[] = {"Sphere","Cube","Cylinder","Cone","Plane"};
    string $text = `textField -q -tx objNameTF`;
    for($i in $objTypes)
    {
        if ($text == $i)
            optionMenu -e -v $i objTypeOM;
    }
}

  最后是Ok按钮的命令,在按下Ok按钮时我希望能根据objTypeOM所选的项目来创建相应的物体,物体的名称则是objNameTF里的内容,这就需要mel_btnCmd()
global proc mel_btnCmd()
{
    string $objType = `optionMenu -q -v objTypeOM`;
    string $objName = `textField -q -tx objNameTF`;
    switch($objType)
    {
        case "Sphere":
            polySphere -n $objName;
            break;
        case "Cube":
            polyCube -n $objName;
            break;
        case "Cylinder":
            polyCylinder -n $objName;
            break;
        case "Cone":
            polyCone -n $objName;
            break;
        case "Plane":
            polyPlane -n $objName;
            break;
    }
}

  现在我们把这些方法和对应的控件进行绑定,选择objTypeOM在Property Editor里点击加号图标并选择"String"来添加动态属性



  因为"Combo Box"就是optionMenu,所以我们只要加入optionMenu命令的标签maya就能识别,需要注意的是在标签前面是"-"的代表使用mel,是"+"的代表使用python,我为什么给上面的方法都加一个"mel"前缀,就是为了区分mel和python。我们需要的是"changeCommand"标签,所以我们要输入"-changeCommand"



  然后在"-changeCommand"属性中加入"mel_changeType()"(包括双引号),来完成绑定



  同样我们也给objNameTF添加"-changeCommand"属性,并将它和"mel_changeName()"绑定;而Ok按钮就添加"-command"属性并将它和"mel_btnCmd()"绑定;最后是Close按钮,也给它添加"-command"属性,并输入"deleteUI QtDialog",这样在点击Close时就会关闭窗口。
  把UI保存为createDialog.ui(可以是其它名称),我们可以转到maya来了,因为我的本本无法使用maya2011,所以就无法截图了。在脚本编辑器(mel面板)中执行下面的脚本
// 请根据你的createDialog.ui文件路径进行修改
// 如果使用的是win系统,请使用\\来代替\
string $dialog = `loadUI  -uiFile "/home/schi/createDialog.ui"`;
showWindow $dialog;

// objTypeOM command
global proc mel_changeType()
{
    string $objType = `optionMenu -q -v objTypeOM`;
    textField -e -tx $objType objNameTF;
}

// objNameTF command
global proc mel_changeName()
{
    string $objTypes[] = {"Sphere","Cube","Cylinder","Cone","Plane"};
    string $text = `textField -q -tx objNameTF`;
    for($i in $objTypes)
    {
        if ($text == $i)
            optionMenu -e -v $i objTypeOM;
    }
}

// Ok button command
global proc mel_btnCmd()
{
    string $objType = `optionMenu -q -v objTypeOM`;
    string $objName = `textField -q -tx objNameTF`;
    switch($objType)
    {
        case "Sphere":
            polySphere -n $objName;
            break;
        case "Cube":
            polyCube -n $objName;
            break;
        case "Cylinder":
            polyCylinder -n $objName;
            break;
        case "Cone":
            polyCone -n $objName;
            break;
        case "Plane":
            polyPlane -n $objName;
            break;
    }
}



  这个窗口就会出现在你的面前,当然是黑色的UI,你可以选择不同的物体类型来查看效果,或是在物体名称栏中输入"Sphere","Cube","Cylinder","Cone","Plane"(不包括双引号),最后点击按钮,你都会看到相应的动作。

  你还可以将这个窗口和maya的主窗口进行整合,这样可以使你的窗口像Attribute Editor和Channel Box一样可以随便移动到maya的主窗口的任何位置,你只需要使用这一行命令
dockControl -content $dialog;

  要使用python命令,就是把控件的属性添加成"+"的就行,其它都是一样的,需要注意的是你不能给控件同时添加"-"和"+"的属性,因为这样做并不能同时使用mel和python反而会造成无法识别方法而发生错误。

最后附上python的方法并附上.ui文件
# 请根据你的createDialog.ui文件路径进行修改
# 如果使用的是win系统,请使用\\来代替\
dialog = cmds.loadUI(uiFile='C:\\mack\\qt\\createDialog_py.ui')
cmds.showWindow(dialog)

# 如需要整合到maya主界面,可以使用该行
cmds.dockControl( area='left', content=dialog )

# objTypeOM command
def py_changeType():
    objType = cmds.optionMenu('objTypeOM_py',q=1,v=1)
    cmds.textField('objNameTF_py',e=1,tx=objType)

# objNameTF command
def py_changeName():
    objTypes = ("Sphere","Cube","Cylinder","Cone","Plane")
    name = cmds.textField('objNameTF_py',q=1,tx=1)
    [cmds.optionMenu('objTypeOM_py',e=1,v=i) for i in objTypes if name == i]
    
# Ok button command
def py_btnCmd():
    objType = cmds.optionMenu('objTypeOM_py',q=1,v=1)
    name = cmds.textField('objNameTF_py',q=1,tx=1)
    
    if objType == "Sphere": cmds.polySphere(n=name)
    elif objType == "Cube": cmds.polyCubee(n=name)
    elif objType == "Cylinder": cmds.polyCylinder(n=name)
    elif objType == "Cone": cmds.polyCone(n=name)
    elif objType == "Plane": cmds.polyPlane(n=name)
  • 大小: 50 KB
  • 大小: 42.5 KB
  • 大小: 56.4 KB
  • 大小: 18.1 KB
  • 大小: 38.6 KB
  • 大小: 48.3 KB
  • 大小: 63.6 KB
  • 大小: 21.4 KB
  • 大小: 58.6 KB
  • 大小: 55.8 KB
  • 大小: 108.8 KB
  • 大小: 22.6 KB
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics