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, приведенный выше код не работает - я обновил пример, чтобы указать на проблему для будущих читателей.