Платформа: 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
PfunnyGuy 29 Июн 2016 в 00:44
Содержит ли этот ранее заданный вопрос ответ, который вы ищете?
 – 
sytech
29 Июн 2016 в 01:03
1
Я не могу воспроизвести эту проблему с помощью PySide-1.2.4. Предположительно, CentOS 6 имеет гораздо более старую версию PySide, в которой есть ошибки. Какую именно версию вы используете?
 – 
ekhumoro
29 Июн 2016 в 04:03
@Gator_Python: это не помогает, поскольку он цитирует части, специфичные для PyQt, а я застрял на PySide.
 – 
PfunnyGuy
29 Июн 2016 в 05:45
@ekhumoro: Не знаю. Я сделал каталог (PySide), и у меня нет версии , поэтому, вероятно, ответ "Старая". Я посмотрю, как обновить это. Изменить: «yum» говорит о версии 0.4.1. 0.o Это просто вредит моему мозгу ...
 – 
PfunnyGuy
29 Июн 2016 в 05:50
PySide.QtCore.QSettings.qRegisterMetaType - не удалось найти примеры использования. Но, похоже, есть. Но не знаю, почему у вас возникла проблема.
 – 
sytech
29 Июн 2016 в 07:40

1 ответ

Лучший ответ

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

PySide.QtCore.QSettings.qRegisterMetaType

1
sytech 29 Июн 2016 в 18:46
Откуда вы это берете? qRegisterMetaType не является функцией-членом QSettings или любого другого класса. Это часть QMetaType, которая не реализуется PySide. Если вы используете версию PySide, которая каким-то образом предоставляет qRegisterMetaType, это ошибка. Вариант использования для реализации qRegisterMetaType не существует, потому что PyObject автоматически регистрируется в системе метатипов PySide.
 – 
ekhumoro
29 Июн 2016 в 21:00