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

2024-09-30 22:16:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用PySide(pythonqt绑定)。在

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

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

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

我的图形用户界面中有:

^{pr2}$

由于有几个相似的工作线程运行,所有线程都连接到同一个插槽(即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。在


Tags: selfsignalobjectgui线程机制workerpyside
2条回答

我很抱歉,很晚才给你答复。声誉不足,无法对您接受的答案添加评论。我希望这可以帮助新的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

解决方案:在QObject中实现了connect属性,因此必须首先通过QMainWindow.__init__(self)或{}(Py2)或{}(Py3)调用父级的init方法。在

干杯。在

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

我把所有的信号都换成了新的语法。如果有人想知道,我是通过在worker类中定义一个自定义信号来实现的。所以我的代码看起来像这样

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没有属性连接”错误,这非常奇怪。在

相关问题 更多 >