Python Pyqt中的Maya大纲视图不';不收费

Python Pyqt中的Maya大纲视图不';不收费,python,pyqt4,maya,outliner,Python,Pyqt4,Maya,Outliner,我尝试在maya中使用一个大纲视图,它与Pyqt4和python一起使用,我的大纲视图与其他两个面板一起使用在Qsplitter中,看起来代码还可以,但是当我运行代码时,大纲视图有时会出现,有时不会出现 这是我创建大纲视图的代码: self.outliner = QWidget() self.outliner.setObjectName("outliner") self.outLayout = QGridLayout() self.outLayout.setContentsMargins(0,

我尝试在maya中使用一个大纲视图,它与Pyqt4和python一起使用,我的大纲视图与其他两个面板一起使用在Qsplitter中,看起来代码还可以,但是当我运行代码时,大纲视图有时会出现,有时不会出现

这是我创建大纲视图的代码:

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)
我需要修改什么使它每次都能工作

编辑:


我升级了代码,删除了不共享的行,但仍然无法按照我需要的方式工作

切换到应答格式:

如果不依赖硬编码名称,则当前代码会更好:

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=关键字应该为你做父母

潜伏者更新


正如OP所指出的,上面的代码不起作用——为了未来读者的利益,我已经更新了示例以指出问题

这就是我完成的工作:

第一部分是相同的

    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)
将Maya小部件转换为QWidget

    self.outPanel = sip.wrapinstance(long(ptr), QObject)
最后将小部件添加到我的布局中

    self.outLayout.addWidget(self.outPanel)

在面板之间的引用中使用绝对名称。你确定你没有失败,因为有一个未删除的“panelLayout”或“outLayout”可能会引起问题吗?@theodox也许,我必须检查一下,但如果是这样,
deleteUI
应该删除它,不是吗?我不确定你用硬编码的名字到底是什么意思,但我认为您引用了类似于
panel=cmds.formLayout(parent=“outLayout”)
的内容,因为我尝试了
parent=self.outLayout
,它向我发送了一个错误,但即使进行了更改,它仍然存在相同的问题。我使用的“控件”是因为我在互联网上找到了调用ouliner的方法,但如果我把它取出来,它似乎工作得很好啊-我明白了:outLayout是QGridLayout,而不是典型的maya.cmds对象:它们总是返回实际控件的字符串名称(可能不是您要求的名称…这样做的全部原因)我的错。不过,您可能会发现此链接很有用:它对我帮助很大,但他们正在执行我想要的操作,他们正在PyQt中使用列表并将其放入Maya UI中。但是,是的,几乎是一样的