我刚刚发现了如何将Maya的内部UI集成到Qt中,但是他们的代码经过一些检查,因此很难在不创建单独的Maya窗口的情况下定义任何小部件。
由于我可以在创建此窗口后获取窗口小部件的Qt实例,因此我可以从中读取任何内容,从而使我绕过pm.*
包装器直接创建Qt对象?
我已经浏览过Maya的python代码,并且没有引用很多它们的小部件,所以我想它们都是用C ++定义的。
这是一个简单的示例,说明如何在Maya中创建小部件,然后将其移至Qt窗口:
from PySide2 import QtWidgets, QtCore, QtGui
from shiboken2 import wrapInstance
import maya.OpenMayaUI as omUI
import pymel.core as pm
class Window(QtWidgets.QWidget):
def __init__(self):
# Normal Qt stuff
parent = wrapInstance(int(omUI.MQtUtil.mainWindow()), QtWidgets.QWidget)
super(Window, self).__init__(parent)
self.setWindowFlags(QtCore.Qt.Window)
# Build a Maya window
with pm.window():
with pm.frameLayout(label='Buttons', collapsable=True) as mayaWidget:
with pm.columnLayout():
pm.button()
# Get the Qt instance of the widget
widget = pm.uitypes.toQtObject(mayaWidget)
# Add it to the layout
layout = QtWidgets.QVBoxLayout()
layout.addWidget(widget)
self.setLayout(layout)
Window().show()
每个UI元素都内置在QWidget
中,因此没有什么比自定义类更明显了。
仅需说明一下,我对此过程背后的过程感兴趣,也许对将其包装到包装程序定义的任何小部件都感兴趣,但我并没有特别关注frameLayout
。