Autodesk Maya 模型面板调整大小事件

Posted

技术标签:

【中文标题】Autodesk Maya 模型面板调整大小事件【英文标题】:Autodesk Maya model panel resize event 【发布时间】:2015-04-21 04:00:30 【问题描述】:

我正在为 Maya 编写一个简单的工具菜单,我想将它粘贴到模型面板的边框(透视)。

from PySide import QtCore, QtGui
from maya import OpenMayaUI as omui
from shiboken import wrapInstance

class TestWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent = self.getMayaWindow())

        self.setWindowFlags(QtCore.Qt.Tool | QtCore.Qt.FramelessWindowHint)
        self.setFixedSize(100, 100)

        panelPtr = omui.MQtUtil.findControl('modelPanel4')
        panel = wrapInstance(long(panelPtr), QtGui.QWidget) 

        position =  panel.mapToGlobal(panel.pos())
        self.move(position.x(), position.y() + panel.geometry().height() / 2 - self.geometry().height() / 2)

        mainLayout = QtGui.QVBoxLayout(self)

        button = QtGui.QPushButton('CLOSE')
        button.setFixedSize(80, 80)
        button.clicked.connect(self.deleteLater)

        mainLayout.addWidget(button)

    def getMayaWindow(self):
        omui.MQtUtil.mainWindow()    
        ptr = omui.MQtUtil.mainWindow()
        return wrapInstance(long(ptr), QtGui.QWidget)

w = TestWidget()
w.show()

主小部件在创建时准确定位在我想要的位置(水平在模型面板的左侧,垂直 - 在模型面板的中间)。

当模型面板调整大小时,我需要相应地重新定位它,但模型面板不会发出resized() 信号。如有任何建议,我将不胜感激。

【问题讨论】:

有什么方法可以从父窗口获取resized 信号? @mhlester 据我所知,Maya 主窗口或任何其他原生 Maya 小部件在调整大小时不会发出任何事件。 【参考方案1】:

昨天我已经尝试了很多方法来让它正常工作。我今天做了一些补充研究,来到了这个话题:cgsociety: Creating a floating button inside the viewport

如果链接断开,这是答案之一:

您可以使用几何图形,但在触发方面存在一些问题 基于选择和撤消队列的命令。如果你想去那个 路线,我建议研究 zooHud 和 zooTriggers(部分 动物园工具箱)

如果您想要实际的 GUI 控件作为视口的父级,mel 仅提供 hudslider、hudbutton 和 headUpMessage。

您还可以在自己的自定义小部件/布局中使用 PyQt 和父级,或者 无论您想使用什么:

import maya.OpenMayaUI as apiUI import sip

from PyQt4 import QtGui

view = apiUI.M3dView()
apiUI.M3dView.getM3dViewFromModelPanel('modelPanel4', view) 
viewWidget = sip.wrapinstance(long(view.widget()), QtCore.QObject)

global myBtn 
myBtn = QtGui.QPushButton(viewWidget)
myBtn.setText('testing!') 
myBtn.move(100, 100) #Relative to top-left corner of viewport myBtn.show()

你可以做一个完整的 qt 小部件可以做的任何事情,所以它是 非常灵活。但它需要安装 PyQt,这 根据您的工具分布情况,可能会成为障碍。

我混合了这个答案和你的代码:

from PySide import QtCore, QtGui
from maya import OpenMayaUI as omui
from shiboken import wrapInstance

class CustomQWidget(QtGui.QWidget):    
    def __init__(self, *args, **kwargs):
        QtGui.QWidget.__init__(self, *args, **kwargs)

        mainLayout = QtGui.QVBoxLayout(self)

        closeButton = QtGui.QPushButton('CLOSE')
        closeButton.setFixedSize(80, 40)
        closeButton.clicked.connect(self.deleteLater)

        helloButton = QtGui.QPushButton('HELLO')
        helloButton.setFixedSize(80, 40)
        helloButton.clicked.connect(self.printHello)

        #Trying to fix glitchy background / Doesn't work, why?
        #Is it because layouts don't have background?
        p = self.palette()
        p.setColor(self.backgroundRole(), QtCore.Qt.red)
        self.setPalette(p)
        self.setAttribute(QtCore.Qt.WA_StyledBackground, True)
        ##############################

        mainLayout.addWidget(closeButton)
        mainLayout.addWidget(helloButton)

    def printHello(self):
        print "Hello"

view = omui.M3dView()
omui.M3dView.getM3dViewFromModelPanel('modelPanel4', view) #Given the name of a model panel, 
#get the M3dView used by that panel. If this fails, then a panel with the given name could not be located.
viewWidget = wrapInstance(long(view.widget()), QtGui.QWidget)

position =  viewWidget.mapToGlobal(viewWidget.pos())

w = CustomQWidget(viewWidget)
w.move(0, viewWidget.geometry().height() / 2 - 100 / 2) #Relative to middle-left corner of viewport
w.show()

我遇到的一个问题是小部件的背景出现故障:

如果有人知道为什么以及如何解决它,我会很高兴地编辑我的答案。 否则,当从 Maya 的脚本编辑器运行此脚本时,小部件在调整大小时会跟随面板。

【讨论】:

【参考方案2】:

我确实解决了这样一个问题,但没有使用 Python/PyQt。

问题本身是,您的 Qt Widget 就在那里。我还没有找到让它绘制背景的方法。

我的解决方案不同:我从 Qt 布局派生,将所有小部件推入该布局,并使用 MQtUtil 获取该模型面板的 modelEditor 的 QWidget 以将“真正的 Qt 布局”附加到它。

可能使 Python 不适合的严重警告: Maya 不希望“非 Maya”布局绑定到“真实 Maya”小部件(如模型编辑器)。因此,您需要监听 QEvents 并找出何时销毁您的布局,这样 Maya 才不会在尝试时崩溃。

【讨论】:

【参考方案3】:

设置 autofillbackground True 以解决您的背景绘制问题

【讨论】:

以上是关于Autodesk Maya 模型面板调整大小事件的主要内容,如果未能解决你的问题,请参考以下文章

Maya2015安装与激活指南

玛雅动画导入unity颠倒了

是否有调整面板和视频大小以进行播放的技巧

python 使用Python的Autodesk Maya热键

如何在对象上调整大小 - Autodesk Forge Viewer

Autodesk Maya fbx 文件导出