我一直在用
this
Maya中的包装器,以便我可以将Qt窗口设置为
workspaceControl
链接的版本无法处理
closeEvents
Qt.WA_DeleteOnClose
作为Qt窗口上的属性并链接
destroyed
发信号给
close()
但是,我发现
geometry
,
width
,
move
,等等,由于窗口位于多个级别的家长中,因此无法正常工作。实际上,要获得这些值,您需要调用
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)