删除workspaceControl/running uiScript, maya/pyside

Posted

技术标签:

【中文标题】删除workspaceControl/running uiScript, maya/pyside【英文标题】:deleting workspaceControl/running uiScript, maya/pyside 【发布时间】:2018-08-13 10:22:00 【问题描述】:

我正在用 Maya 写东西,但遇到了麻烦。真的不知道我做了什么,发生这种情况时我打算处理其他事情,我做的最后一件事是在布局中添加一个按钮。 我已经搞砸了很长时间,据我所知,uiScript 标志不喜欢方法调用中传递的参数......?发生的情况是,它永远不会将恢复标志设置为 True,因此该位永远不会命中。导致它在maya中产生多个窗口。我还试图弄清楚 cmds.deleteUI 的 try 子句应该放在哪里,但在这发生之前我不确定我在哪里。如果有人能提供任何见解,我将不胜感激,欢呼/S

在下面的脚本中,我只用一个按钮替换了我的 ui 实例,这对行为没有影响。

代码:

//////////

from PySide2 import QtWidgets, QtCore
from maya.app.general.mayaMixin import MayaQWidgetDockableMixin
import maya.OpenMayaUI as mui
import maya.cmds as cmds
import weakref

if not 'customMixinWindow' in globals():
    customMixinWindow = None

class DockableWidget(MayaQWidgetDockableMixin, QtWidgets.QWidget):


    instances = list()
    CONTROL_NAME = 'customMixinWindow'

    def __init__(self, parent=None):

        super(DockableWidget, self).__init__(parent=parent)

        DockableWidget.delete_instances()
        self.__class__.instances.append(weakref.proxy(self))
        self.main_layout = QtWidgets.QVBoxLayout()
        self.button = QtWidgets.QPushButton()
        self.main_layout.addWidget(self.button)
        self.setLayout(self.main_layout)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

    @staticmethod
    def delete_instances():
        print "deleting"
        for ins in DockableWidget.instances:
            try:
                ins.setParent(None)
                ins.deleteLater()
            except:
                pass
                DockableWidget.instances.remove(ins)
            del ins


def DockableWidgetUIScript(restore=False):

    global customMixinWindow

    if restore == True:
        restoredControl = mui.MQtUtil.getCurrentParent()

    customMixinWindow = DockableWidget()
    if customMixinWindow is None:
        #customMixinWindow = DockableWidget()
        customMixinWindow.setObjectName('customMayaMixinWindow')

    if restore == True:
        mixinPtr = mui.MQtUtil.findControl(customMixinWindow.objectName())
        mui.MQtUtil.addWidgetToMayaLayout(long(mixinPtr), long(restoredControl))

    else:
        try:
            cmds.workspaceControl('customMayaMixinWindowWorkspaceControl', e=True, close=True)
            cmds.deleteUI('customMayaMixinWindowWorkspaceControl')
        except:
            pass
        customMixinWindow.show(dockable=True, restore=True, height=400, width=400, uiScript='import dockWin; dockWin.DockableWidgetUIScript(restore=True)')

def main():

    ui = DockableWidgetUIScript()
    return ui


if __name__ == 'dockWin':
    main()

【问题讨论】:

【参考方案1】:

好的,问题解决了。 经过大量故障排除后,结果是我的 ui 中的 QSpacerItem 导致窗口打开一次,然后第二次使 Maya 崩溃。这让我觉得它与 deleteUI 的东西有关。

我像这样添加了 QSpacerItem:

self.spacerFive = QtWidgets.QSpacerItem(5 , 5)
self.myLayout.addSpacerItem(self.spacerFive)

这使得 Maya 在删除 UI/workspaceControl 时完全崩溃…… 不知道为什么,垃圾回收?

这修复了它:

self.myLayout.addSpacerItem(QtWidgets.QSpacerItem(5, 5))

好的,一切都再次按预期工作。干杯/S

【讨论】:

以上是关于删除workspaceControl/running uiScript, maya/pyside的主要内容,如果未能解决你的问题,请参考以下文章

Linux_019_删除rm

gorm软删除和硬删除

开发环境Mac 中删除 Python ( 删除 Python 框架 | 删除 Python 应用程序 | 删除 Python 链接 )

linux按年份删除文件?

删除功能的实现(单个删除与批量删除)

vi-vim :删除撤销恢复删除复制删除