如何使用 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 -> Animation Editors -> Graph Editor
。第二种解决方案有风险,我建议对您正在修改的任何文件进行备份。您可以直接编辑此文件C:\Program Files\Autodesk\Maya2014\scripts\others\graphEditorPanel.mel
和此功能特别是addGraphEditor
以向图形编辑器添加一个按钮。以上是关于如何使用 PySide 在 Maya 中为通道框添加新按钮?的主要内容,如果未能解决你的问题,请参考以下文章
Maya PySide:当我尝试将自定义信号连接到插槽时,Maya 崩溃
使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件