MAYA 的 GUI 元件嵌入 Qt

把 Maya GUI 元件 wrap 成 Qt widget 之後就可以嵌入到 Qt 製作的介面中.

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()