无法在 closeEvent 中获取 Maya 的 workspaceControl window 几何体
Unable to get Maya's workspaceControl window geometry in closeEvent
我一直在使用 Maya 中 this 包装器的改编版,这样我就可以 parent Qt window 到 workspaceControl
,这使得它可以停靠与用户界面的不同部分。基本上它使用 Maya 自己的代码创建一个空的可停靠 window,获取指向它的 C++ 指针,并将 Qt window 包装在 window.
中
链接的版本无法正确处理 closeEvents
,因此我对其进行了调整,以便在关闭时始终触发。我通过将 Qt.WA_DeleteOnClose
设置为 Qt window 上的属性并将 destroyed
信号链接到 close()
.
来做到这一点
但是,我发现 geometry
、width
、move
等功能无法正常工作,因为 window 处于多个级别parent秒。事实上,要获得这些值中的任何一个,您需要调用 self.parent().parent().parent().parent().parent().func()
。当 window 关闭时出现问题,因为它似乎在调用 closeEvent
之前删除了更高级别的 parents,导致错误 self.parent().parent()
returns None
之后
我希望能够在退出时保存 window 位置,但不知道如何在信息被删除之前访问该信息。除了每次任何函数 运行 时都记录它之外,有没有什么方法可以让我在最后干净地完成它?
这是我能想出的最简洁的示例:
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 似乎没有正确关闭和销毁它的小部件,至少没有调用关闭事件。因此,即使保留属性设置为 false(在 Maya2018 中尝试),closeCommand 也会被调用。解决方法是使用 visibleChangeCommand。如果单击关闭按钮,它会被调用。
我一直在使用 Maya 中 this 包装器的改编版,这样我就可以 parent Qt window 到 workspaceControl
,这使得它可以停靠与用户界面的不同部分。基本上它使用 Maya 自己的代码创建一个空的可停靠 window,获取指向它的 C++ 指针,并将 Qt window 包装在 window.
链接的版本无法正确处理 closeEvents
,因此我对其进行了调整,以便在关闭时始终触发。我通过将 Qt.WA_DeleteOnClose
设置为 Qt window 上的属性并将 destroyed
信号链接到 close()
.
但是,我发现 geometry
、width
、move
等功能无法正常工作,因为 window 处于多个级别parent秒。事实上,要获得这些值中的任何一个,您需要调用 self.parent().parent().parent().parent().parent().func()
。当 window 关闭时出现问题,因为它似乎在调用 closeEvent
之前删除了更高级别的 parents,导致错误 self.parent().parent()
returns None
之后
我希望能够在退出时保存 window 位置,但不知道如何在信息被删除之前访问该信息。除了每次任何函数 运行 时都记录它之外,有没有什么方法可以让我在最后干净地完成它?
这是我能想出的最简洁的示例:
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 似乎没有正确关闭和销毁它的小部件,至少没有调用关闭事件。因此,即使保留属性设置为 false(在 Maya2018 中尝试),closeCommand 也会被调用。解决方法是使用 visibleChangeCommand。如果单击关闭按钮,它会被调用。