PySide & Python:如何通过 Signal/Slot 发送字典?
PySide & Python: How to send a dictionary via Signal/Slot?
平台: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 class 中,这消除了注册错误,但从未调用 Slot 操作,所以我不知道数据实际去向何处。
我觉得解决方案在打我的脸,但我看不到 "missing semi-colon"。我准备好只使用信号向 GUI 指示共享队列中有一些东西可以让它完成 - 一个不太优雅的解决方案。
为完整起见,以下是我已阅读但对我没有帮助的类似帖子:
Whosebug: sending-custom-pyqt-signals
Whosebug: Qt: Not registered qRegisterMetaType()
Whosebug: QObject (QPlainTextEdit) & Multithreading issues
Whosebug: QObject::connect: Cannot queue arguments of type 'object' in PySide
TIA Whosebug 社区!
根据文档,以下是该方法的位置。如评论中所述,您应该将 PySide 升级到最新版本,因为您遇到的问题在当前版本中无法重现。
PySide.QtCore.QSettings.qRegisterMetaType
平台: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 class 中,这消除了注册错误,但从未调用 Slot 操作,所以我不知道数据实际去向何处。
我觉得解决方案在打我的脸,但我看不到 "missing semi-colon"。我准备好只使用信号向 GUI 指示共享队列中有一些东西可以让它完成 - 一个不太优雅的解决方案。
为完整起见,以下是我已阅读但对我没有帮助的类似帖子:
Whosebug: sending-custom-pyqt-signals
Whosebug: Qt: Not registered qRegisterMetaType()
Whosebug: QObject (QPlainTextEdit) & Multithreading issues
Whosebug: QObject::connect: Cannot queue arguments of type 'object' in PySide
TIA Whosebug 社区!
根据文档,以下是该方法的位置。如评论中所述,您应该将 PySide 升级到最新版本,因为您遇到的问题在当前版本中无法重现。
PySide.QtCore.QSettings.qRegisterMetaType