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