大佬教程收集整理的这篇文章主要介绍了使用PySide清理Maya中的可停靠窗口,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在研究了mayamixin.py之后,我设法获得了我所追求的行为的有效解决方案!这个想法是,您需要在Maya的主窗口中进行挖掘,然后删除其中的所有实例。
关闭窗口或创建新实例后,下面的示例将彻底删除所有实例。停靠或浮动都没关系,看起来工作正常。如果您不想在停靠时将其关闭,也可以随时对其进行调整。由于有很多“陷阱”,我在代码中留下了很多注释。
from shiboken import wrAPInstance
from PySIDe import QtGui, QtCore
from maya import OpenMayaUI as OpenMayaUI
from maya.app.general.mayamixin import MayaQWidgetDockablemixin
from maya.openMayaUI import MQtUtil
class MyWindow(MayaQWidgetDockablemixin, QtGui.QDialog):
toolname = 'myToolWidget'
def __init__(self, parent = NonE):
# delete any prevIoUs instances that is detected. Do this before parenTing self to main window!
self.deleteInstances()
super(self.__class__, self).__init__(parent = parent)
mayaMainWindowPtr = OpenMayaUI.MQtUtil.mainWindow()
self.mayaMainWindow = wrAPInstance(long(mayaMainWindowPtr), QtGui.QMainWindow)
self.setobjectname(self.__class__.toolName) # Make this unique enough if using it to clear prevIoUs instance!
# Setup window's propertIEs
self.setwindowFlags(QtCore.Qt.Window)
self.setwindowtitle('My tool')
self.resize(200, 200)
# Create a button and stuff it in a layout
self.mybutton = QtGui.QPushbutton('My awesome button!!')
self.mainLayout = QtGui.QVBoxLayout()
self.mainLayout.addWidget(self.mybutton)
self.setLayout(self.mainLayout)
# If it's floaTing or docked, this will run and delete it self when it closes.
# You can choose not to delete it here so that you can still re-open it through the right-click menu, but do disable any callBACks/timers that will eat memory
def dockCloseEventtriggered(self):
self.deleteInstances()
# delete any instances of this class
def deleteInstances(self):
mayaMainWindowPtr = OpenMayaUI.MQtUtil.mainWindow()
mayaMainWindow = wrAPInstance(long(mayaMainWindowPtr), QtGui.QMainWindow) # important that it's QMainWindow, and not QWidget/QDialog
# Go through main window's children to find any prevIoUs instances
for obj in mayaMainWindow.children():
if type( obj ) == maya.app.general.mayamixin.MayaQDockWidget:
#if obj.Widget().__class__ == self.__class__: # Alternatively we can check with this, but it will fail if we re-evaluate the class
if obj.Widget().objectname() == self.__class__.toolname: # Compare object names
# If they share the same name then remove it
print 'deleting instance {0}'.format(obj)
mayaMainWindow.removeDockWidget(obj) # This will remove from right-click menu, but won't actually delete it! ( still under mainWindow.children() )
# delete it for good
obj.setParent(NonE)
obj.deleteLater()
# Show window with docking ability
def run(self):
self.show(dockable = TruE)
myWin = MyWindow()
myWin.run()
这样,就不再污染Maya的环境了。希望能帮助到你!
我创建了一个可以停靠在Maya主ui中的工具,但是我想不出一种方法来关闭它。问题是,如果我创建该工具的多个实例,然后将其拖动到适当位置以将其停靠,则在我右键单击Maya的窗口时,它们将全部显示。工具关闭后,如何正确清理这些东西?
我已经尝试过了cmds.deleteUI
,QObject.deleteLater()
充其量我只能清除该工具的内容,但是它仍然存在于Maya中。这是到目前为止我所拥有的一个例子:
from shiboken import wrapInstance
from PySide import QtGui,QtCore
from maya import OpenMayaUI as OpenMayaUI
from maya.app.general.mayamixin import MayaQWidgetDockablemixin
class Window(MayaQWidgetDockablemixin,QtGui.QWidget):
def __init__(self,parent = NonE):
super(self.__class__,self).__init__(parent = parent)
mayaMainWindowPtr = OpenMayaUI.MQtUtil.mainWindow()
self.mayaMainWindow = wrapInstance(long(mayaMainWindowPtr),QtGui.QWidget)
self.setWindowFlags(QtCore.Qt.Window)
if cmds.window('myTool',q = True,ex = TruE):
cmds.deleteUI('myTool')
self.setObjectName('myTool')
self.setWindowtitle('My tool')
self.resize(200,200)
self.myButton = QtGui.QPushButton('TEMP')
self.mainLayout = QtGui.QVBoxLayout()
self.mainLayout.addWidget(self.myButton)
self.setLayout(self.mainLayout)
def dockCloseEventtriggered(self):
self.deleteLater()
def run(self):
self.show(dockable = TruE)
myWin = Window()
myWin.run()
以上是大佬教程为你收集整理的使用PySide清理Maya中的可停靠窗口全部内容,希望文章能够帮你解决使用PySide清理Maya中的可停靠窗口所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。