代码之家  ›  专栏  ›  技术社区  ›  Peter

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

  •  0
  • Peter  · 技术社区  · 7 年前

    我一直在用 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)
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   haggi krey    7 年前

    workspaceControl似乎没有正确地关闭和销毁它的小部件,至少没有调用close事件。因此,即使retain属性ist设置为false(在2018年5月尝试过),closeCommand也会被调用。解决方法是使用visiblechange命令。如果单击“关闭”按钮,则会调用它。