QMetaObject :: invokeMethod не находит методы с параметрами

Это продолжениеQMetaObject :: invokeMethod не находит метод, Вызов метода без параметров работает. Но распространение предыдущего вопроса на методы с параметрами снова возвращает меня к провалу.

Смотрите следующий пример скрипта в 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'))

Выходные данные с PySide 1.2.1 и Python 3.3 на Windows 7 и Ubuntu 14.04 также:

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

Это означает, что вызовы invokeMethod для локальных методов завершились неудачно. Только вызов Example: dup () дал ожидаемый результат. Два испытания, чтобы получить Пример: beep (str) для работы не удалось, хотя сообщения об ошибках дают сигнатуры методов, которые на самом деле должны существовать.

Я поставил более раннюю версию этого вопроса наСписок рассылки PySide но это не было ответа.

Вопрос: как сделатьQMetaObject::invokeMethod вызывать локальный метод и метод класса с параметрами в привязках Python Qt (желательно в PySide)?

редактировать: Кстати: если кто-то знает, чтоSignal:emit(...) или жеQtCore.QTimer.singleShot(0, ...) сделать под капотом, это может помочь и здесь. Ведь все эти разные подходы имеют очень похожие эффекты.

edit2:

С'QString' в качестве имени параметра предупреждающие сообщения исчезают, но в Python происходит сбой в целом с ошибками сегмента. Это может быть ошибка реализации PySide. Кажется, что правило состоит в том, что нужно указывать типы Qt-C ++ параметров в invokeMethod и типы Python в слотах.

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_()

Ответы на вопрос(1)

Ваш ответ на вопрос