PySide& Python:如何通过Signal / Slot发送字典?

时间:2016-06-28 21:44:28

标签: python qt pyside

平台:Centos 6& Python 2.6.6

在查看每个例子和关于这样做的问题之后,对于我的生活,我无法让它在我的系统上工作。大多数答案似乎都围绕着使用PyQt而不是PySide,这对我来说不是一个选择:我必须使用公司给我的东西。

以下是我的主GUI应用程序的代码片段:

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的成员。

那么如何将'object'注册为通过Signal / Slot范例传递的有效类型?我甚至尝试在QObject类中包装字典,这样就删除了注册错误,但是从不调用Slot操作,所以我不知道数据实际上在哪里。

我觉得解决方案是打我的脸,但我看不到“缺少分号”。我准备好只使用信号向GUI指示共享队列中有什么东西可以启动它 - 这是一个不太优雅的解决方案。

为了完整起见,这里有类似的帖子,我读过但没有帮助过我:

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社区!

1 个答案:

答案 0 :(得分:1)

根据文档,以下是该方法的位置。正如评论中所提到的,您应该将PySide升级到最新版本,因为您所拥有的问题在当前版本中无法重现。

BadRequestException