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

问题描述 投票:0回答:1

我是一个初学者,正在尝试将 PySide UI 脚本包装到一个类中。到目前为止,一切都很好。

但是,单击按钮时,它没有运行该函数(或者它没有告诉我是否正在运行)。不处理打印语句。但是不会引发任何错误。当我使用非类包装版本时,它运行良好。

我知道我在这里缺少一些东西,但不确定。请指教!

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()
button pyqt pyside maya
1个回答
1
投票

一切都很完美,但您应该知道您没有存储对主类的任何引用,即

UI
。如果这样做,在执行
UI()
后,所有内容都会被 Python 销毁(收集垃圾)。这也应该在窗口弹出后立即关闭它,但它不会,因为您将 Maya 窗口设置为父窗口。如果内存中不存在对象,则任何信号和槽都不起作用。如果您不熟悉垃圾收集,请参阅此页面

所以解决方案是存储引用

obj = UI()
而不是仅仅存储
UI()
,这样对象就不会被破坏。

© www.soinside.com 2019 - 2024. All rights reserved.