2016-06-28 2 views
0

Платформа: Centos 6 & Python 2.6.6PySide & Python: Как отправить словарь через Signal/Slot?

После просмотра каждого примера и вопрос о том, делать это для жизни меня я не могу заставить его работать на моей системе. Большинство ответов, похоже, вращаются вокруг, используя 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.

Как я могу зарегистрировать «объект» в качестве допустимого типа для прохождения через парадигму Signal/Slot? Я даже попробовал обернуть словарь внутри класса QObject и удаляет регистрационную ошибку, но операция Slot никогда не вызывается, поэтому я не знаю, где данные фактически идут.

Я чувствую, что решение похлопывает меня по лицу, но я не вижу «отсутствующую полуточку». Я готов только использовать сигнал, чтобы указать графическому интерфейсу, что в общей очереди есть что-то, что можно сделать - менее элегантное решение.

Для полноты здесь аналогичные должности, которые я прочитал, но не помогли мне:

stackoverflow: sending-custom-pyqt-signals

stackoverflow: Qt: Not registered qRegisterMetaType()

stackoverflow: QObject (QPlainTextEdit) & Multithreading issues

stackoverflow: QObject::connect: Cannot queue arguments of type 'object' in PySide

TIA StackOverflow сообщество !

+0

ли это [ранее заданный вопрос] (http://stackoverflow.com/questions/2585442/sending-custom-pyqt-signals) содержат ответ, который вы ищете? – sytech

+1

Я не могу воспроизвести эту проблему, используя PySide-1.2.4. Предположительно, CentOS 6 имеет гораздо более старую версию PySide, которая является ошибкой. Какую точную версию вы используете? – ekhumoro

+0

@Gator_Python: Это не помогает, поскольку он ссылается на части, специфичные PyQt, и я застрял с PySide. – PfunnyGuy

ответ

1

Ниже приведено расположение этого метода в соответствии с документами. Как уже упоминалось в комментариях, вы должны обновить PySide до последней версии, поскольку проблема, с которой вы сталкиваетесь, не была воспроизводимой в текущей версии.

PySide.QtCore.QSettings.qRegisterMetaType

+0

Откуда вы это взяли? 'qRegisterMetaType' не является функцией-членом' QSettings' или любого другого класса. Он является частью [QMetaType] (http://doc.qt.io/qt-4.8/qmetatype.html), который не реализован PySide. Если вы используете версию PySide, которая каким-то образом раскрывает 'qRegisterMetaType', это ошибка. Для реализации 'qRegisterMetaType' нет смысла использовать, потому что PyObject автоматически регистрируется в системе метатипов PySide. – ekhumoro

Смежные вопросы