我正在将一些脚本从PyQt移到PySide,并且有关于插槽名称的问题。对于上下文,我们的UI是使用Qt Designer创建的。保存为.ui
个文件。使用.py
转换为pyside-uic
个文件。然后在Autodesk Maya中使用这些脚本。
生成的.py
脚本使用以下命令将信号连接到插槽:
QtCore.QMetaObject.connectSlotsByName(Dialog)
。
这会查找名为on_<objectname>_<signalname>()
的广告位,例如on_pushButton_clicked()
。
以前使用PyQt4,我们将插槽命名如下:
@QtCore.pyqtSlot( name = "on_pushButton_clicked" )
def testButton_pressed( self ):
print "pressed button"
在PySide中,这变为:
@QtCore.Slot( name = "on_pushButton_clicked" )
def testButton_pressed( self ):
print "pressed button"
这适用于PyQt,但不适用于PySide。 PySide不再识别插槽中的“name”参数。解决方法是将testButton_pressed()
函数重命名为on_pushButton_clicked()
,但我宁愿不必为所有脚本执行此操作。有没有更好的方法让PySide识别插槽“名称”参数?
答案 0 :(得分:0)
这显然是一个错误。 PySide documentation表示支持name
参数,但在信号触发时会生成RuntimeError
(使用版本1.2.1)。如果没有name
参数,信号将正常工作。
通过名称连接插槽的机制肯定仍然存在,因为故意使用无效名称,例如:
@QtCore.Slot(name='on_button_clickedXXX')
def foo(self):
print('on_button_clicked')
产生此错误:
QMetaObject::connectSlotsByName: No matching signal for on_button_clickedXXX()
答案 1 :(得分:0)
这样做:
@QtCore.Slot(str)
def on_pushButton_clicked(self, name = "on_pushButton_clicked"):
print "pressed button"