我正在使用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
。
答案 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)。
干杯。