Платформа: Centos 6 и Python 2.6.6
После просмотра каждого примера и вопроса о том, как это сделать, хоть убей, я не могу заставить его работать в моей системе. Большинство ответов, похоже, вращаются вокруг использования PyQt вместо PySide, что для меня не вариант: я должен использовать то, что мне дает компания.
Вот фрагмент кода из моего основного приложения с графическим интерфейсом:
from PySide import QtCore, QtGui
class MyGui( QtGui.QMainWindow ):
@QtCore.Slot( dict )
def MySlot( self, data ):
CodeThatUsesData()
И модуль, излучающий сигнал:
from PySide.QtCore import *
from PySide.QtGui import *
class QListener( QThread ):
MySignal = Signal( dict )
def DoSomeWork( self ):
data = {'a':1, 'b':2}
self.MySignal.emit( data )
И, конечно же, у меня есть код, который соединяет сигнал и слот:
listener.MySignal.connect( gui.MySlot )
И ошибка, которую я получаю при вызове DoSomeWork()
(в частности, в строке emit()
), следующая:
QObject::connect: Cannot queue arguments of type 'object'
(Make sure 'object is registered using qRegisterMetaType().)
Из того, что я читал, это должно полностью работать. Еще больше расстраивает то, что я нашел документацию PySide, в которой упоминается использование qRegisterMetaType, но я не могу понять, откуда его вызвать. Его нет в QtCore или QtGui, или автономно, или в составе QMainWindow, QThread или QObject.
Итак, как мне зарегистрировать «объект» как допустимый тип для передачи через парадигму сигнала / слота? Я даже пробовал обернуть словарь внутри класса QObject, и это устраняет ошибку регистрации, но операция Slot никогда не вызывается, поэтому я не знаю, куда на самом деле идут данные.
Я чувствую, что решение дает мне пощечину, но я не вижу «отсутствующей точки с запятой». Я почти готов просто использовать сигнал, чтобы указать графическому интерфейсу пользователя, что в общей очереди есть что-то, что он может выполнить, - менее чем элегантное решение.
Для полноты, вот похожие сообщения, которые я читал, но мне не помогли:
stackoverflow: отправка пользовательских сигналов pyqt
stackoverflow: Qt: Не зарегистрировано qRegisterMetaType ()
stackoverflow: QObject (QPlainTextEdit) и проблемы с многопоточностью
stackoverflow: QObject :: connect: невозможно поставить в очередь аргументы типа 'object' в PySide
Сообщество TIA stackoverflow!
1 ответ
Ниже показано расположение этого метода согласно документации. Как упоминалось в комментариях, вам следует обновить PySide до последней версии, поскольку проблема, с которой вы столкнулись, не воспроизводилась в текущей версии.
PySide.QtCore.QSettings.qRegisterMetaType
qRegisterMetaType
не является функцией-членом QSettings
или любого другого класса. Это часть QMetaType, которая не реализуется PySide. Если вы используете версию PySide, которая каким-то образом предоставляет qRegisterMetaType
, это ошибка. Вариант использования для реализации qRegisterMetaType
не существует, потому что PyObject
автоматически регистрируется в системе метатипов PySide.
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.