Working with Qt maya2011

7 篇文章 0 订阅
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
[url]ftp://ftp.qt.nokia.com/qt/source/qt-win-opensource-4.5.3-mingw.exe[/url]

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

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

安装好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"

[img]http://dl.iteye.com/upload/attachment/237430/8ca111df-b13a-3e05-a4ee-078e254c8fcc.png[/img]

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

[img]http://dl.iteye.com/upload/attachment/237432/ab309d13-b766-39c0-ba44-042d2c86fdd4.png[/img]

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

[img]http://dl.iteye.com/upload/attachment/237437/f680b080-6bb9-3b04-94bf-b913a216f062.png[/img][img]http://dl.iteye.com/upload/attachment/237440/14c203d3-b39b-35cc-a11f-b34acb60c1f9.png[/img]

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

[img]http://dl.iteye.com/upload/attachment/237442/2eeaf617-89d9-334d-b6b1-cdb161998156.png[/img]

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

[img]http://dl.iteye.com/upload/attachment/237446/8c18a779-c3da-3404-9db7-423114085bc2.png[/img]

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

[img]http://dl.iteye.com/upload/attachment/238027/b731caff-66fd-3f6b-9eec-15b9018febb6.png[/img]

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

[img]http://dl.iteye.com/upload/attachment/238040/a06ab2a8-03a2-3104-b541-11957a4c38d2.png[/img]

到这里我们的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"来添加动态属性

[img]http://dl.iteye.com/upload/attachment/238055/a9e4ce67-c36b-343d-b39d-3223ee523228.png[/img]

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

[img]http://dl.iteye.com/upload/attachment/238061/e3a1df83-b411-376b-8731-0310fd9abcc5.png[/img]

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

[img]http://dl.iteye.com/upload/attachment/238070/21e03fe3-5e4d-33f9-b696-e17b43c471fd.png[/img]

同样我们也给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;
}
}

[img]http://dl.iteye.com/upload/attachment/238096/ece4832b-b2af-37ab-801b-f1cfd02b0a86.png[/img]

这个窗口就会出现在你的面前,当然是黑色的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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值