【问题标题】:Maya Outliner in Pyqt doesn't chargePyqt 中的 Maya Outliner 不收费
【发布时间】:2013-05-22 15:03:43
【问题描述】:

好吧,我正在尝试在 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)

我需要修改以使其每次都能正常工作

编辑:

我升级了我的代码,删除了一些行,但仍然无法按我需要的方式工作

【问题讨论】:

  • 您在面板之间的引用中使用了绝对名称。你确定你没有失败,因为周围有一个未删除的“panelLayout”或“outLayout”可能会导致问题吗?
  • @theodox 也许,我必须检查一下,但如果是这样的话,deleteUI 应该删除它,不是吗?

标签: python pyqt4 maya outliner


【解决方案1】:

切换回答格式:

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

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 所指出的,上面的代码不会工作 - 我已经更新了示例以指示问题,以使未来的读者受益。

【讨论】:

  • 我不确定你对硬编码名称的真正含义,但我认为你指的是panel = cmds.formLayout(parent="outLayout")之类的东西,因为我尝试使用parent=self.outLayout,它给我发送了一个错误,但是即使进行了更改,它仍然存在相同的问题。我使用的“控件”是我在互联网上找到的调用 ouliner 的方式,但如果我把它拿出来,它似乎工作正常
  • 啊 - 我明白了:outLayout 是 QGridLayout,而不是典型的 maya.cmds 对象:它们总是返回实际控件的字符串名称(这可能不是您要求的名称......这样做的全部原因)我的错。但是,您可能会发现此链接很有用:tech-artists.org/forum/…
  • 这对我帮助很大,但他们正在做我想要的相反,他们在 PyQt 中使用一个列表并将其放在 Maya UI 中。但是是的,几乎是一样的
【解决方案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)

将 Maya 小部件转换为 QWidget

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

最后将小部件添加到我的布局中

    self.outLayout.addWidget(self.outPanel)

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多