如何使用 PySide 在 Maya 中为通道框添加新按钮?

Posted

技术标签:

【中文标题】如何使用 PySide 在 Maya 中为通道框添加新按钮?【英文标题】:How can I parent a new button to the channel box in Maya using PySide? 【发布时间】:2016-03-03 01:13:08 【问题描述】:

我对 PySide 有非常基本的了解。我希望为现有频道框添加一个按钮。但是,除了获取 Maya 主窗口之外,我不确定从哪里开始。 (但我什至不确定这是否正确):

from PySide import QtGui, QtCore
from shiboken import wrapInstance
from maya.OpenMayaUI import MQtUtil

channelBox = wrapInstance(long(MQtUtil.findControl('mainChannelBox')), QtGui.QWidget)

【问题讨论】:

只有一个按钮?您希望按钮显示在哪里?在通道盒的顶部,还是在边缘的某个地方? 【参考方案1】:

弄乱 Maya 的 UI 可能是一项艰巨的任务,有两种方法可以做到这一点。 首先是使用maya.cmds 将小部件添加到 Maya 的 UI。第二个是像您一样在 Qt 类中包装 Maya 小部件。

这里有一个类似的问题:How do I parent new, user-created buttons inside the Graph Editor window? 我只回答了maya.cmds 代码,使用 PySide 可能还有其他您可能感兴趣的答案。

这里有一个解决方案:

nbIteration = 0
def getChildren(uiItem, nbIteration):
    for childItem in cmds.layout(uiItem, query=True, childArray=True):
        try:
            print "|___"*nbIteration + childItem
            getChildren(uiItem + "|" + childItem, nbIteration+1)
        except:
            pass
getChildren("MayaWindow|MainChannelsLayersLayout", nbIteration)

如果您运行此代码,它将为您提供包含在 Channel Box / Layer Editor 中的小部件的名称

ChannelButtonForm <-- This is the form containing the 3 buttons on the top-right 
|___cbManipsButton
|___cbSpeedButton
|___cbHyperbolicButton
ChannelsLayersPaneLayout <-- This is the layout containing the channel box and the layer editor. A paneLayout has a splitter to resize his childrens.
|___ChannelBoxForm 
|___|___menuBarLayout1 
|___|___|___frameLayout1
|___|___|___|___mainChannelBox
|___LayerEditorForm
|___|___DisplayLayerUITabLayout
|___|___|___DisplayLayerTab
|___|___|___|___formLayout3

根据您希望按钮捕捉的位置,您必须选择一个布局作为按钮的父级。

在这种情况下,我在通道盒/图层编辑器的左上角放置了一个按钮,与 3 个复选框按钮处于同一级别。

import maya.cmds as cmds

cmds.button("DrHaze_NewButton", l="HELLO", p="MayaWindow|MainChannelsLayersLayout|ChannelButtonForm")

由于您没有告诉我们您希望按钮放置在哪里,如果您想要更合适的内容,则必须编辑您的问题。

【讨论】:

这很棒。谢谢!我还尝试在 Graph Editor 和 Outliner 中设置一个按钮。使用上述命令作为getChildren("graphEditor1Window|", nbIteration) 似乎不起作用。它说它找不到图表编辑器,尽管cmds.lsUI 说它存在。 试试这个:getChildren("graphEditor1Window|TearOffPane", nbIteration) 您需要将布局传递给getChildren 函数。 对于大纲:getChildren("sequenceEditorPanel1Window|TearOffPane", nbIteration) 感谢@DrHaze!这是一个我没有想到的泡菜:在当前设置下,窗口必须已经存在才能将新的 UI 按钮等插入其中一个表单。在创建新的 GraphEditor 窗口时插入按钮的最佳方法是什么? 作为一个简短的回答,我在这里看到了两个解决方案。首先是编写一个创建自定义图形编辑器的脚本,如我在链接问题中的回答。你必须调用这个脚本而不是进入Window -&gt; Animation Editors -&gt; Graph Editor。第二种解决方案有风险,我建议对您正在修改的任何文件进行备份。您可以直接编辑此文件C:\Program Files\Autodesk\Maya2014\scripts\others\graphEditorPanel.mel 和此功能特别是addGraphEditor 以向图形编辑器添加一个按钮。

以上是关于如何使用 PySide 在 Maya 中为通道框添加新按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PySide 获取 Maya 主窗口指针?

如何在我的PySide(Maya)脚本中修复“迭代非序列”

使用 PySide2 开发 Maya 插件系列 总览

Maya PySide:当我尝试将自定义信号连接到插槽时,Maya 崩溃

使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件

maya 独立与 pyside2