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()
,这样对象就不会被破坏。
我是初学者,正在尝试将 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()
,这样对象就不会被破坏。