Q_ARG отсутствует в PySide — что делать?

Я столкнулся с проблемой при работе с PySide [Python 3.3.3/PySide 1.2.1] и invokeMethod — похоже, что в PySide не встроен макрос Q_ARG.

QtCore.QMetaObject.invokeMethod(self.worker, '_reader_run_mfoc_dummy',
                                             QtCore.Qt.QueuedConnection,
                                             QtCore.Q_ARG(str, self.get_keys_filename()),
                                             QtCore.Q_ARG(str, self.get_dump_filename()))

возвращает:

QtCore.Q_ARG(str, self.get_keys_filename()),
AttributeError: 'module' object has no attribute 'Q_ARG'

Несмотря на предупреждения из Документов не делать этого, даже если я попытаюсь передать общий аргумент, это не удастся (но по другой причине):

QtCore.QMetaObject.invokeMethod(self.worker, '_reader_run_mfoc_dummy',
                                             QtCore.Qt.QueuedConnection,
                                             QtCore.QGenericArgument("str",self.get_keys_filename()),
                                             QtCore.QGenericArgument("str",self.get_dump_filename()))

QMetaObject::invokeMethod: Нет такого метода Worker::_reader_run_mfoc_dummy(str,str)

Несмотря на то, что моя подпись Slot / Method:

@QtCore.Slot(str, str)
def _reader_run_mfoc_dummy(self, keys_filename, dump_filename):

У кого-нибудь есть предложение о том, как обойти эту проблему? Я не уверен, почему ему не удается найти целевой метод.


person swx    schedule 20.05.2014    source источник


Ответы (1)


Кажется, это ошибка в PySide. invokeMethod в настоящее время не работает с аргументами в PySide. Используйте QtCore.QTimer.singleshot(..) или вместо этого отправьте событие или издайте сигнал.

См. мой вопрос QMetaObject::invokeMethod не находит методы с параметрами здесь. Также вы должны использовать QString вместо str в QGenericArgument, но тогда Python рухнет.

person Trilarion    schedule 22.05.2014
comment
Да, вещи, связанные с qthread, действительно глючат в PySide. PyQt намного лучше. - person kawing-chiu; 24.09.2016