python - QObject::connect:无法在 PySide 中对类型 'object' 的参数进行排队

标签 python multithreading qt events

我正在使用 PySide(Python Qt 绑定(bind))。

我有一个 QThread 类的工作线程,它通过信号/槽机制更新主 GUI 线程(更新 QTableWidget)。

在我的工作线程中,我有以下内容:

self.emit(SIGNAL("alterTable(object"), params)

在我的 GUI 线程中我有这个:

self.connect(self.worker, SIGNAL("alterTable(object)"), self.updateMainTable, Qt.AutoConnection)

由于有几个类似的工作线程运行并连接到同一个插槽(self.updateMainTable),因此我应该使用 AutoConnection(以及 QueuedConnection)。使用 Qt.DirectConnection 可以,但它不安全(至少我被告知)。

但是当我尝试使用自动连接时,出现以下错误:

QObject::connect: Cannot queue arguments of type 'object'
(Make sure 'object' is registered using qRegisterMetaType().)

我在 Google 上搜索了很长时间,试图找到一种在 PySide 中使用 qRegisterMetaType() 的方法,但没有成功。我在网上找到的所有资源都指向 C++ 语法/文档。

如果有什么区别的话,大多数情况下,所讨论的对象是一个dict

最佳答案

我想我自己已经找到了答案,但不完全是答案,而是一个可行的解决方案。

我将所有信号切换为新式语法。如果有人想知道,我是通过在我的工作类中定义自定义信号来做到这一点的。所以我的代码看起来像这样

class Worker(QThread):

    alterTable = Signal(dict)

    def __init__(self, parent=None):
        ....
        self.alterTable.emit(parameters)


class GUI(QMainWindow):

    def __init__(self, parent=None):
        WorkerModule.Worker().alterTable.connect(self.myMethod)

出于某种原因,信号必须位于 QThread 类内部;否则,Qt 会提示“Signal has no attribute connect”错误,这很奇怪。

关于python - QObject::connect:无法在 PySide 中对类型 'object' 的参数进行排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13302393/

相关文章:

java - 如何在 Mongo Async Java Driver 上实现多线程?

c++ - 在 Qt 中捕获程序的 stderr 输出

python - 接受一个列表并返回一个仅包含原始元素的列表的函数?

python - 一行异常处理

java - 使用 run() 而不是 start() 启动线程

c++ - QThreadPool maxThreadCount 在应用程序和 DLL 中不同

qt - 是否可以通过单击项目在 QTreeView 中取消选择?

c++ - Qt 从 SoapRequest 获取响应

python - Windows 10 上的最新蚊子未运行

python - 制作一个可停止的简单秒表