我正在为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()
信号。我很感激任何建议。
答案 0 :(得分:1)
昨天我一直在尝试很多工作来实现这个目标。我今天做了一些额外的研究,并谈到了这个主题:cgsociety: Creating a floating button inside the viewport
如果链接断开,这就是答案之一:
您可以使用几何体,但触发有一些问题 基于选择和撤消队列的命令。如果你想去那 路线,我建议调查zooHud和zooTriggers(部分 zooToolbox)
如果您希望实际的GUI控件是视口的父级,那么mel 只提供hudslider,hudbutton和headsUpMessage。
您也可以在自己的自定义小部件/布局中使用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()
我遇到的一个问题是窗口小部件的背景是glitched:
如果有人知道为什么以及如何解决它,我会愉快地编辑我的答案。 此外,从Maya的脚本编辑器运行此脚本时,窗口小部件在调整大小时会跟随面板。
答案 1 :(得分:0)
我确实解决了这个问题,但没有使用Python / PyQt。
问题本身就是,你的Qt Widget就在那里。我还没有办法让它不描绘它的背景。
我的解决方案不同:我从Qt Layout派生,将我的所有小部件都推送到该布局,并使用MQtUtil获取该modelPanel的modelEditor的QWidget,以将“真正的Qt布局”附加到它。
可能使Python不适合的重要警告: Maya不希望“非Maya”布局绑定到像“modelEditors”这样的“真实Maya”小部件。因此,您需要收听QEvents并找出何时销毁您的布局,因此Maya不会崩溃尝试。
答案 2 :(得分:0)
设置autofillbackground True以修复背景绘画问题