我是一个初学者,正在尝试将 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()
一切都很完美,但您应该知道您没有存储对主类的任何引用,即
UI
。如果这样做,在执行 UI()
后,所有内容都会被 Python 销毁(收集垃圾)。这也应该在窗口弹出后立即关闭它,但它不会,因为您将 Maya 窗口设置为父窗口。如果内存中不存在对象,则任何信号和槽都不起作用。如果您不熟悉垃圾收集,请参阅此页面
所以解决方案是存储引用
obj = UI()
而不是仅仅存储 UI()
,这样对象就不会被破坏。