我找到了一个有点脏的修复方法,但到目前为止似乎工作可靠。
所以首先,我发现如果你创建了上面的两个实例
parent_wrap
,并在创建第二个之前获取父级,可以单独进入窗口,而不会引起问题。它一直工作到窗口停靠/分离的点,但这会删除旧的父级并提供新的父级,因此旧的指针不再有效。
似乎在初始化窗口之前提供了这个父级,这样我就可以用
self.parent().parent()....
不会破坏代码。
如果状态已更改(浮动/停靠),并且每当
RuntimeError
发生,但由于它不会对性能造成巨大影响,为了简单起见,我只是在每次需要时重新生成它。
重写一个函数,比如
move
例如,下面介绍如何使用它:
def move(self, x, y):
if self.dockable:
return self._parent_override().move(x, y)
return QtWidgets.QMainWindow.move(self, x, y)
这是解决这个问题的override类:
def _parent_override(self, create=True):
#Determine if it's a new window, we need to get the C++ pointer again
if not hasattr(self, '__temp_parent'):
base = qt_get_window(self.ID)
else:
base = self.parent()
#Get the correct parent level
if pm.workspaceControl(self.ID, query=True, floating=True):
parent = base.parent().parent().parent().parent()
else:
parent = base.parent().parent()
#Even though this attribute is never used,
#PySide2 is dumb and deletes the parent if it's not set
self.__temp_parent = parent
return parent