从PyQt迁移到PySide,使用命名插槽

0 投票
2 回答
759 浏览
提问于 2025-04-18 01:15

我正在把一些脚本从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()

撰写回答