无法在closeEvent中获得Maya的工作区控制窗口几何

时间:2018-08-16 13:53:28

标签: python qt maya pyside2

我一直在Maya中使用this包装器的改编版,以便可以将Qt窗口作为workspaceControl的父级,这使其可以与用户界面的不同部分对接。基本上,它使用Maya自己的代码创建一个空的可停靠窗口,获取指向它的C ++指针,并将Qt窗口包装在该窗口内。

链接的版本无法正确处理closeEvents,因此我对其进行了调整,以便它总是在关闭时触发。我是通过在Qt窗口上将Qt.WA_DeleteOnClose设置为属性并将destroyed信号链接到close()来实现的。

但是,我发现geometrywidthmove等功能无法正常使用,因为该窗口位于多个父级中。实际上,要获取任何这些值,您需要调用self.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)

1 个答案:

答案 0 :(得分:0)

workspaceControl似乎无法正确关闭并销毁其小部件,至少未调用close事件。因此,即使将rest属性ist设置为false(在Maya2018中尝试),也确实调用了closeCommand。解决方法是使用visibleChangeCommand。如果单击关闭按钮,它将被调用。