PySide UI 作为 Class: button.clicked.connect 未连接

PySide UI as a Class: button.clicked.connect not connecting

我是初学者,正在尝试将 PySide UI 脚本包装到 class 中。到目前为止,还不错。

但是,在单击按钮时,它不是 运行 函数(或者它没有告诉我是否是)。打印语句不处理。但是没有错误被抛出。当我使用非 class 包装版本时 运行 很好。

我知道我在这里遗漏了一些东西但不确定。请指教!

PS - 这是在 Maya 中完成的,但我猜这更像是 PySide 的事情。

import maya.cmds as cmds
from PySide import QtGui
import maya.OpenMayaUI as mui
import shiboken

class UI(object):
    def __init__(self):

        self.constraintMaster_UI()

    def getMayaWindow(self):
        pointer = mui.MQtUtil.mainWindow() # This is Maya's main window
        QtGui.QMainWindow.styleSheet(shiboken.wrapInstance(long(pointer), QtGui.QWidget))
        return shiboken.wrapInstance(long(pointer), QtGui.QWidget)

    def clickedButton(self):
        print "You just clicked the button!"

    def constraintMaster_UI(self):

        objectName = "pyConstraintMasterWin"

        # Check to see if the UI exists, if so delete it
        if cmds.window("pyConstraintMasterWin", exists = True):
            cmds.deleteUI("pyConstraintMasterWin", wnd = True)

        # Create the window, parent it to the main Maya window (parent -> window).
        # Assign the object name (window name string) to the window
        parent = self.getMayaWindow()
        window = QtGui.QMainWindow(parent)
        window.setObjectName(objectName)
        window.setWindowTitle("Constraint Master")
        window.setMinimumSize(400, 125)
        window.setMaximumSize(400, 125)

        # Create the main widget to contain all the stuff, parent it to the main Widget
        mainWidget = QtGui.QWidget()
        window.setCentralWidget(mainWidget)

        # Create the main vertical layout, add the button and its command
        verticalLayout = QtGui.QVBoxLayout(mainWidget)

        button = QtGui.QPushButton("Create Constraint")
        verticalLayout.addWidget(button)
        button.clicked.connect(self.clickedButton)

        window.show()

UI()

一切都很完美,但您应该知道您没有存储任何对 UI 主 class 的引用。如果这样做,在 UI() 执行后,所有内容都会被 Python 销毁(收集垃圾)。这也应该在 window 弹出后立即关闭它,但它不会,因为您将 maya window 设为父级。如果内存中不存在任何对象,则信号和槽都不会起作用。如果你对垃圾回收不熟悉,参考这个page

所以解决方案是存储引用 obj = UI() 而不仅仅是 UI(),这样对象就不会被破坏。