Python 无法获取Maya';s关闭事件中的工作空间控制窗口几何图形

Python 无法获取Maya';s关闭事件中的工作空间控制窗口几何图形,python,qt,maya,pyside2,Python,Qt,Maya,Pyside2,我在Maya中使用了包装器的一个改编,这样我就可以将Qt窗口设置为workspaceControl,这使得它可以与用户界面的不同部分对接。基本上,它使用玛雅自己的代码创建一个空的可停靠窗口,得到它的C++指针,并将窗口中的QT窗口封装起来。 链接的版本无法正确处理closeEvents,因此我对其进行了调整,以便在关闭时始终触发它。为此,我将Qt.WA_DeleteOnClose设置为Qt窗口上的一个属性,并将destrocted信号链接到close() 但是,我发现诸如几何体、宽度、移动等函数

我在Maya中使用了包装器的一个改编,这样我就可以将Qt窗口设置为
workspaceControl
,这使得它可以与用户界面的不同部分对接。基本上,它使用玛雅自己的代码创建一个空的可停靠窗口,得到它的C++指针,并将窗口中的QT窗口封装起来。 链接的版本无法正确处理
closeEvents
,因此我对其进行了调整,以便在关闭时始终触发它。为此,我将
Qt.WA_DeleteOnClose
设置为Qt窗口上的一个属性,并将
destrocted
信号链接到
close()

但是,我发现诸如
几何体
宽度
移动
等函数无法正常工作,因为窗口位于多个父级中。实际上,要获取这些值中的任何一个,您需要调用
self.parent().parent().parent().parent().parent().parent().func()
。当窗口关闭时会出现问题,因为它似乎在调用
closeEvent
之前删除了更高级别的父级,这导致了一个错误,因为
self.parent().parent()
在此之后返回
None

我希望能够在退出时保存窗口位置,但在信息被删除之前,我不知道如何访问该信息。除了每次运行任何函数时都记录它之外,还有什么方法可以让我在最后干净利落地完成它吗

下面是我能想到的最精简的示例:

from PySide2 import QtWidgets, QtCore
from shiboken2 import wrapInstance
import maya.OpenMayaUI as omUI
import pymel.core as pm

def dockable_window(window_class):
    main_control = pm.workspaceControl(window_class.ID)
    win_ptr = omUI.MQtUtil.findControl(window_class.ID)
    control_wrap = wrapInstance(int(win_ptr), QtWidgets.QWidget)
    control_wrap.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    win = window_class(control_wrap)
    control_wrap.destroyed.connect(win.close)

class MyWindow(QtWidgets.QMainWindow):
    ID = 'testing'
    def __init__(self, parent, *args, **kwargs):
        QtWidgets.QMainWindow.__init__(self, parent)

        #Create a button that will show the geometry when clicked
        b = QtWidgets.QPushButton('test')
        b.clicked.connect(self.show_actual_geometry)
        parent.layout().addWidget(b)

    def show_actual_geometry(self):
        """This will work until it is called during closeEvent."""
        print self.parent().parent().parent().parent().parent().geometry()

    def closeEvent(self, event):
        print self.show_actual_geometry()
        QtWidgets.QMainWindow.closeEvent(self, event)

dockable_window(MyWindow)

workspaceControl似乎没有正确关闭和销毁其小部件,至少没有调用close事件。因此,即使retain属性ist设置为false(2018年5月尝试),closeCommand也会被调用。解决方法是使用visiblechange命令。如果单击“关闭”按钮,将调用它。

workspaceControl提供一个close命令。也许这是一种保存位置和大小的方法。我从来没有试过这样做。我尝试过的每个函数都会导致
语法错误:无效语法#
,因为它出于某种原因试图调用一个空的MEL函数。啊,好的。即使没有出现语法错误,workspaceControl也不会按预期的方式运行,因为如果单击“关闭”按钮,它不会关闭。它只是隐藏的。您可以使用visibleChangeCommand,该命令在可见性状态更改时调用。因此,您的问题可能是maya不会关闭和销毁workspaceControl,而只是将其隐藏。不,我错了,窗口已关闭,只有close命令未调用。