无法在 closeEvent 中获取 Maya 的 workspaceControl 窗口几何图形

Posted

技术标签:

【中文标题】无法在 closeEvent 中获取 Maya 的 workspaceControl 窗口几何图形【英文标题】:Unable to get Maya's workspaceControl window geometry in closeEvent 【发布时间】:2018-08-16 13:53:28 【问题描述】:

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

链接的版本无法正确处理closeEvents,因此我对其进行了调整,使其始终在关闭时触发。我通过将Qt.WA_DeleteOnClose 设置为Qt 窗口上的属性并将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)

【问题讨论】:

workspaceControl 提供了一个 closeCommand。也许这可能是一种保存位置和大小的方法。 我从来没有设法让它工作。我尝试过的每个函数都会产生SyntaxError: invalid syntax #,因为它出于某种原因试图调用一个空的 MEL 函数。 啊,好的。即使我没有收到语法错误,workspaceControl 也不会按预期运行,因为如果您点击关闭按钮,它不会关闭。它只是隐藏的。您可以使用可见性状态更改时调用的 visibleChangeCommand。 所以你的问题可能是 Maya 没有关闭和销毁 workspaceControl,而只是隐藏它。 不,我错了,窗口关闭了,只有关闭命令没有调用。 【参考方案1】:

workspaceControl 似乎没有正确关闭和销毁它的小部件,至少没有调用 close 事件。因此,即使将保留属性设置为 false(在 Maya2018 中尝试过),也会调用 closeCommand。一种解决方法是使用 visibleChangeCommand。如果单击关闭按钮,则会调用它。

【讨论】:

以上是关于无法在 closeEvent 中获取 Maya 的 workspaceControl 窗口几何图形的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Maya 插件中编译顶点着色器

maya小白笔记——Maya2018中模型无法选中的几种可能(目前遇到的)

按 F1 时无法在浏览器中打开 Maya 的帮助页面

在 Mac OS X 和 Maya 中安装 PyQt4

无法启动 Maya 集成的 qt designer 的解决方法和原因 以及 中英文切换

为啥maya删后无法重装?