使用命名槽从PyQt移动到PySide

时间:2014-04-03 22:19:22

标签: python pyqt pyside maya

我正在将一些脚本从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识别插槽“名称”参数?

2 个答案:

答案 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"