Maya 大部分的工具開發都是以 Qt 作為介面, 如果想要在 Qt 製作的介面中使用 Maya 專屬的 GUI 元件, 像是 viewport, node editor, UV editor 等等, 可以透過 shiboken2.wrapInstance
把 Maya 的元件包成 Qt widget, 再加到以 Qt 製作的介面中.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| import PySide2.QtWidgets as QtWidgets
import shiboken2
import maya.cmds as cmds
import maya.OpenMayaUI as OpenMayaUI
# 用 QDialog 產生視窗
window = QtWidgets.QDialog()
window.setWindowTitle("Qt window")
# 產生一個 Qt horizontal box layout.
qt_layout = QtWidgets.QHBoxLayout(window)
# 取得 Qt layout 的指標 pointer
qt_layout_pnt = int(shiboken2.getCppPointer(qt_layout)[0])
# 透過指標取得 Qt layout 在 Maya 內的名稱.
layout_name = OpenMayaUI.MQtUtil.fullName(qt_layout_pnt)
# 把預設的 layout 更改為剛剛取得的 layout, i.e. 接下來產生的 Maya GUI 元件都會以這個 layout 作為 parent.
cmds.setParent(layout_name)
# 產生一個 Maya pane layout
maya_layout = cmds.paneLayout()
# 產生一個 node editor
node_editor = cmds.scriptedPanel(type='nodeEditorPanel')
# 取得 Maya layout 的指標
maya_layout_ptr = OpenMayaUI.MQtUtil.findControl(maya_layout)
# 把剛產生的 Maya layout wrap 成 QWidget.
wrapped_layout = shiboken2.wrapInstance(int(maya_layout_ptr), QtWidgets.QWidget)
# 把剛包好的 QWidget 加到 Qt Layout 裡面
qt_layout.addWidget(wrapped_layout)
window.resize(800,600)
window.show()
|