Maya Outliner в Pyqt не заряжается

Ну, я пытаюсь использовать outliner в Maya с Pyqt4 и python. Мой outliner находится в Qsplitter с двумя другими панелями, кажется, код в порядке, но когда я запускаю код, иногда появляется Outliner, иногда не появляется

это код, где я создаю Outliner:

self.outliner = QWidget()
self.outliner.setObjectName("outliner")
self.outLayout = QGridLayout()
self.outLayout.setContentsMargins(0, 0, 0, 0)
self.outLayout.setObjectName("outLayout")
self.outliner.setLayout(self.outLayout)

outL = cmds.outlinerPanel(mbv=False, p="outLayout")

cmds.control(out, edit=True, visible=True, parent="outLayout")

И вот как я это отображаю:

self.splitter1 = QSplitter()

self.splitter1.addWidget(self.list)

self.splitter1.addWidget(self.outliner)

Что мне нужно изменить, чтобы он работал каждый раз

РЕДАКТИРОВАТЬ:

Я обновил свой код, удалив лишние строки, но все равно не работает так, как мне нужно

2 ответа

Решение

Ну вот что я закончил делать:

Первая часть такая же

    self.outliner = QWidget()
    self.outliner.setObjectName("outliner")
    self.outLayout = QGridLayout()
    self.outLayout.setContentsMargins(0, 0, 0, 0)
    self.outLayout.setObjectName("outLayout")
    self.outliner.setLayout(self.outLayout)

затем я "перевожу" Pyqt в Maya, чтобы иметь возможность назначить макет с любым дополнительным кодом

    panel = mui.MQtUtil.fullName(long(sip.unwrapinstance(self.outLayout)))
    cmds.setParent(panel)
    if cmds.modelPanel("outL", exists=True):
        cmds.deleteUI("outL")
    outL = cmds.outlinerPanel(mbv=False)
    cmds.control(outL, edit=True, visible=True, p=panel)
    ptr = mui.MQtUtil.findControl(outL)

Преобразуйте виджет Майя в QWidget

    self.outPanel = sip.wrapinstance(long(ptr), QObject)

И, наконец, добавить виджет в мой макет

    self.outLayout.addWidget(self.outPanel)

Переключение на формат ответа:

Текущий код был бы лучше, если бы вы не зависели от жестко закодированных имен:

self.outliner.setLayout(self.outLayout)
#snip#
# in ordinary maya / python usage you'd do this....
panelLayout = cmds.formLayout("panelLayout", parent=self.outLayout)
# but in your original sample self.Outlayout is not a maya widget but a QT one
# so it doesn't resolve down to a string...
# the line below is the usual idiom
outliner = cmds.outlinerPanel("out", mbv=False, p=panelLayout)

таким образом будут использоваться настоящие имена элементов управления, и вы будете менее уязвимы для бродячих с одинаковыми именами. Хорошей практикой по-прежнему является удаление стримов, но трудно быть уверенным, не делая код очень громоздким.

Также линия:

cmds.control(out, edit=True, visible=True, parent="panelLayout")

выглядит избыточным - это намеренно? Это оставшаяся часть попытки родителя наброски? потому что ключевое слово p = должно быть вашим воспитанием.

Обновление Lurker

Как указывал OP, приведенный выше код не работает - я обновил пример, чтобы указать на проблему для будущих читателей.

Другие вопросы по тегам