从PyQt迁移到PySide,使用命名插槽
我正在把一些脚本从PyQt迁移到PySide,并且有个关于槽名称的问题。为了让大家明白,我们的用户界面是用Qt Designer创建的,保存为.ui
文件。然后用pyside-uic
转换成.py
文件。这些脚本接着在Autodesk Maya中使用。
生成的.py
脚本通过以下命令将信号连接到槽:QtCore.QMetaObject.connectSlotsByName(Dialog)
。
这个命令会查找名称格式为on_<对象名称>_<信号名称>()
的槽,比如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不再识别槽中的“名称”参数。解决办法是把testButton_pressed()
函数重命名为on_pushButton_clicked()
,但我不想为所有脚本都这样做。有没有更好的方法让PySide识别槽的“名称”参数呢?
2 个回答
0
这样做:
@QtCore.Slot(str)
def on_pushButton_clicked(self, name = "on_pushButton_clicked"):
print "pressed button"
0
这明显是个bug。PySide的文档说支持name
这个参数,但在信号触发时(使用1.2.1版本)会出现RuntimeError
错误。如果不使用name
参数,信号就能正常工作。
通过名字连接槽的机制肯定还是存在的,因为故意使用一个无效的名字,比如:
@QtCore.Slot(name='on_button_clickedXXX')
def foo(self):
print('on_button_clicked')
会产生这个错误:
QMetaObject::connectSlotsByName: No matching signal for on_button_clickedXXX()