Я только что нашел, как интегрировать внутренний интерфейс Maya в Qt, но в их коде есть некоторые проверки, которые затрудняют определение каких-либо виджетов без создания отдельного окна Maya.
Поскольку я могу получить экземпляр Qt виджета после создания этого окна, есть ли что-нибудь, что я смогу прочитать из этого, что позволило бы мне обойти оболочку pm.*
для непосредственного создания Qt объект?
Я копался в коде Python Maya, и там нет ссылок на большинство их виджетов, поэтому я думаю, что они все определены в 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()
Каждый отдельный элемент пользовательского интерфейса встроен в QWidget
, поэтому нет ничего более очевидного, чем пользовательские классы.
Просто чтобы прояснить, мне интересен процесс, стоящий за этим, и, возможно, способ сделать это с любым виджетом, который определен оберткой, я не смотрю конкретно на frameLayout
.