QMetaObject :: invokeMethod no encuentra métodos con parámetros

Este es un seguimiento de QMetaObject :: invokeMethod no encuentra el método . Invocar un método sin parámetros funciona. Pero extender la pregunta anterior a métodos con parámetros me lleva nuevamente al fracaso.

Vea el siguiente script de ejemplo en Python:

from PySide import QtCore class Example(QtCore.QObject): def __init__(self): super().__init__() @QtCore.Slot() def dup(self): beep('dup-class') @QtCore.Slot(str) def beep(self, text): print(text) @QtCore.Slot() def dup(self): beep('dup-local') @QtCore.Slot(str) def beep(text): print(text) if __name__ == '__main__': QtCore.QMetaObject.invokeMethod(None, 'dup') QtCore.QMetaObject.invokeMethod(None, 'beep', QtCore.Qt.AutoConnection, QtCore.QGenericArgument('text', 'beep-local')) print('now some classy trials') t = Example() QtCore.QMetaObject.invokeMethod(t, 'dup') QtCore.QMetaObject.invokeMethod(t, 'beep', QtCore.Qt.AutoConnection, QtCore.QGenericArgument('text', 'beep-class')) QtCore.QMetaObject.invokeMethod(t, 'beep', QtCore.Qt.AutoConnection, QtCore.QGenericArgument('self', t), QtCore.QGenericArgument('text', 'beep-class-b')) 

La salida con PySide 1.2.1 y Python 3.3 en Windows 7 y Ubuntu 14.04 también es:

 now some classy trials dup-class QMetaObject::invokeMethod: No such method Example::beep(text) QMetaObject::invokeMethod: No such method Example::beep(self,text) 

Esto significa que las llamadas invokeMethod a métodos locales fallaron silenciosamente. Solo la llamada a Ejemplo: dup () dio el resultado esperado. Los dos bashs para obtener Ejemplo: pitido (str) para funcionar, aunque los mensajes de error dan firmas de métodos que realmente deberían existir.

Presenté una versión anterior de esta pregunta en la lista de correo de PySide, pero no fue respondida.

    Pregunta: ¿Cómo hacer que QMetaObject::invokeMethod llame al método local y de clase con parámetros en los enlaces Qt de Python (preferiblemente en PySide)?

    edición: por cierto: si uno sabe qué Signal:emit(...) o QtCore.QTimer.singleShot(0, ...) haga bajo el capó, eso también podría ayudar aquí. Después de todos estos diferentes enfoques tienen efectos muy similares.


    edit2:

    Con 'QString' como nombre de parámetro, los mensajes de advertencia desaparecen, pero Python falla en su totalidad con segfaults. Puede ser un error de implementación de PySide. La regla parece ser que uno tiene que dar los tipos Qt-C ++ de los parámetros en invokeMethod y los tipos Python en las ranuras.

     from PySide import QtCore class Example(QtCore.QObject): def __init__(self): super().__init__() @QtCore.Slot(str) def beep(self, text='default'): print(text) if __name__ == '__main__': app = QtCore.QCoreApplication([]) e = Example() QtCore.QMetaObject.invokeMethod(e, 'beep', QtCore.Qt.AutoConnection, QtCore.QGenericArgument('QString', 'beep')) QtCore.QTimer.singleShot(1000, app.quit) app.exec_() 

    Para cualquiera que todavía esté interesado en esto:

    A partir de la versión 1.2.4, PySide tiene errores porque no envuelve las macros Q_ARG y Q_RETURN_ARG . En su lugar, envuelve de manera imprudente las clases QGenericArgument y QGenericReturnArgument , que son clases internas de ayuda y no están destinadas a ser instanciadas directamente. Como resultado de esto, la invocación de ranuras con argumentos invariablemente resulta en una falla de segmentación.

    En comparación, PyQt envuelve las macros en lugar de las clases, y no sufre los mismos problemas.