2

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

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

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

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

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

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

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

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

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

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

如果它有任何区别,那么dict大部分时间都是有问题的对象。

4

2 回答 2

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)

由于某种原因,信号必须在 QThread 类中;否则,Qt 会报错“Signal has no attribute connect”,这很奇怪。

于 2012-11-09T05:43:39.957 回答
1

这里的答案令人难以置信地迟到了,我很抱歉。没有足够的声誉来为您接受的答案添加评论。我希望这可能对偶然发现您的问题的新 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)or super(GUI, self).__init__()(Py2) or also super().__init__()(Py3)调用父类的init方法。

干杯。

于 2019-08-03T17:39:47.080 回答