Tuesday, September 28, 2010

Maya Python 試驗之旅(二) UI 篇 part 1

之前雖然有介紹過 Maya 2011 全面引進 Qt 來做為整個 UI 的 framework,使用 Qt Designer 來製作 UI 雖然方便,但有的時候你會遇到需要 run-time 時建 UI 的情況,這時候使用先建好的 UI 就顯得有點不足(應該也可以,但感覺是比較進階的使用),所以回到 Maya MEL Fundamental 的第四章,剛好是 UI 的章節,順便綀習 PyMel 的 UI 部份。


1. 建一個簡單的 UI,有三個按鈕,最後一個有 lable,按下去時會建一個球

from pymel.core import *

# define a button pressed function
def buttonPressed(*args):
    sphere()
    
# create a window and name it "My Window"
win = window(title="My Window")
layout = columnLayout( rowSpacing=5, columnWidth=200 )
# create 3 buttons and the last one with a "createSphere" label
btn1 = button(parent=layout)
btn2 = button(parent=layout)
btn3 = button(label="createSphere", parent=layout, command=buttonPressed)

showWindow()

結果如下,非常容易

2,  同樣的 UI,如果使用 Qt 的話會如何呢?

import pymel.core as pm

dialog1 = pm.loadUI(f='.ui的路徑')
pm.showWindow(dialog1)

UI 由 Qt designer 製作好,在 Maya 這邊叫出這個 UI 只是簡單的二行碼,重點是在做 button 時,不要忘記指定所要執行的 command,之前有一個疑問有關如何得到 UI 中 Control 的資訊,這次也花了一點時間做了試驗,我在 UI 中加了一個 "myLineEdit" 的 control,只需使用以下的 script 就可以得到輸入欄的資訊

textField( dialog1 + "|myLineEdit",query=True,text=True) 

雖然我覺得這樣看起來怪怪的,但是可以用的,只是 UI control 的 objectName 被隱藏在 .ui 檔裡或是 Qt Designer 端,有點資訊不對稱的感覺。


接下來的範例,我都儘量使用 Qt Designer 來做 UI,實作多一點經驗應該可以對 Qt + PyMel 有更深一層的體會,搞不好會發現一些目前還沒注意到的東西 (希望~)。

補充一點,如果想要知道目標 window 是否已經存在,

pymel.window("window name", exists=True) 

如果已經存在的話,就會得到 True 要不然就會得到 False 的值

No comments: