QObject :: connect:无法在PySide中对“对象”类型的参数进行排队

时间:2012-11-09 05:07:01

标签: python multithreading qt events

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

我有一个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作品,但它不安全(或者我被告知)。

但是当我尝试使用AutoConnection时,我收到以下错误:

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

我已经谷歌搜索了如何在PySide中找到如何使用qRegisterMetaType()的方法,但无济于事。我在网上找到的所有资源都指向C ++语法/文档。

如果它有任何区别,那么所讨论的对象大多数时间都是dict

2 个答案:

答案 0 :(得分:1)

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

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

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)

由于某种原因,Signal必须在QThread类中;否则,Qt抱怨“信号没有属性连接”错误,这很奇怪。

答案 1 :(得分:0)

在这里,我的道歉真是太迟了。没有足够的声誉来为您接受的答案添加评论。希望这对遇到您问题的PySide / Pyside2新用户有所帮助。

问题:QObject::connect: Cannot queue arguments of type 'object'

解决方案:self.connect(self.worker, SIGNAL("alterTable(PyObject)"), self.updateMainTable, Qt.AutoConnection)

问题:Qt complains about "Signal has no attribute connect" error

解决方案:connect属性是在QObject中实现的,因此您必须首先通过QMainWindow.__init__(self)super(GUI, self).__init__()(Py2)或super().__init__()调用父对象的init方法( Py3)。

干杯。