【发布时间】:2015-11-06 09:04:29
【问题描述】:
我创建了一个能够停靠在 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()
【问题讨论】:
-
抱歉,我无法重现您的问题。如果我运行您的脚本,我可以以正确的方式拖动、停靠、取消停靠和关闭多个实例。您使用的是什么版本的 Maya?
-
另一件事:如果你的代码中有
if cmds.window('myTool', q = True, ex = True): cmds.deleteUI('myTool'),你不应该运行多个Window实例! -
也许我没有正确解释。我也可以运行、停靠、取消停靠和关闭多个实例。假设您创建了多个实例并将每个实例停靠到频道框/属性编辑器,然后关闭它们。右键单击通道框/属性编辑器窗口的标题,它会在那里显示一堆“我的工具”复选框!这是我无法清除的。
-
^ erm no.. 一次不应该有多个实例。应该只有一个实例,这就是为什么它会尝试删除前一个实例。
-
好的,我明白了。我也尝试过使用
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)或self.setParent(None),但只删除了dockwidget 内容。如果我找到解决方案,我会告诉你