pyqt5出现QObject::connect:Cannot queue arguments of type 'QVector<int>'错误

最近刚开始学pyqt5,搜索后才知道只能在UI线程里绘制界面,不能在子线程里绘制- -,遇到了坑,记录下这个过程

代码是创建子线程调用fun_1,fun_1会修改list,等线程执行完后再将list里的元素添加到TableWidget里

原代码:

list=[...]
def fun_1(i):
	...
	#change list
	...

class fun2Thread(QtCore.QThread):
	def __init__(self,mydialog,parent=None):
		super(fun2Thread, self).__init__(parent)
		#传入了当前窗口
		self.mydialog=mydialog
		
	def run(self):
		lenc = 10
		thread = []
		for i in range(lenc):
			t = threading.Thread(target=fun_1,args=(i,))
			t.setDaemon(True)
			thread.append(t)
			thread[i].start()
		for i in range(lenc):
			thread[i].join()
		for i in range(lenc):
			#每一行第4列添加一个Item
			self.mydialog.tableWidget.setItem(i,3,QtWidgets.QTableWidgetItem(list[i]))

class mydialog(QtWidgets.QWidget,Ui_Form):
	def __init__(self):
		super(mydialog,self).__init__()
		self.setupUi(self)
		
	def fun_2(self):
		self.fThread = fun2Thread(self)
		self.fThread.start()

错误信息:

QObject::connect: Cannot queue arguments of type 'QVector<int>'
(Make sure 'QVector<int>' is registered using qRegisterMetaType().)

注释掉添加Item的那一行就不会报错了,而且报错了还是能修改成功

搜了一圈之后,基本都是Qt的代码,说需要用 qRegisterMetaType 注册 QVector

#include <QMetaType>
qRegisterMetatType<QVector<int>>("QVector<int>");

但是pyqt下似乎没有qRegisterMetatType这个方法,并且看到这个贴:

关于线程中调用QStandardItemModel设置列表信息的问题

代码要实现的功能类似,但是说 qRegisterMetaType 注册后又报其他错,便放弃了这个这条路- -

然后选择定义信号和槽,当所有线程执行完fun_1后,发射一个信号,槽接受到信号后添加Item

list=[...]
def fun_1(i):
	...
	#change list
	...

class fun2Thread(QtCore.QThread):
	#信号
	finish = QtCore.pyqtSignal(int)
	def __init__(self, parent=None):
		super(fun2Thread, self).__init__(parent)
		
	def run(self):
		lenc = 10
		thread = []
		for i in range(lenc):
			t = threading.Thread(target=fun_1,args=(i,))
			t.setDaemon(True)
			thread.append(t)
			thread[i].start()
		for i in range(lenc):
			thread[i].join()
			#发送信号
			self.finish.emit(i)

class mydialog(QtWidgets.QWidget,Ui_Form):
	def __init__(self):
		super(mydialog,self).__init__()
		self.setupUi(self)
	
	#槽函数
	def changeitem(self,i):
		self.tableWidget.setItem(i,3,QtWidgets.QTableWidgetItem(list[i]))
		
	def fun_2(self):
		self.fThread = fun2Thread()
		self.fThread.start()
		#连接信号和槽
		self.fThread.finish.connect(self.changeitem)

参考:PyQt: updating GUI from a callback

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
PyQt5中,QObject::moveToThread()函数可以将一个QObject对象移动到另一个线程中。使用该函数可以实现跨线程的信号和槽连接,以及在多线程应用中管理对象的生命周期。具体用法如下: ```python # 定义一个MyObject类 class MyObject(QObject): mySignal = pyqtSignal(int) def __init__(self, parent=None): super().__init__(parent) @pyqtSlot(int) def mySlot(self, value): print("mySlot called with value:", value) # 创建一个线程对象 thread = QThread() # 创建一个MyObject对象 obj = MyObject() # 将obj对象移动到thread线程中 obj.moveToThread(thread) # 在obj对象所在的线程中发出信号 obj.mySignal.emit(123) # 在thread线程中执行obj对象的槽函数 obj.mySignal.connect(obj.mySlot, Qt.QueuedConnection) thread.started.connect(obj.mySlot) # 启动线程 thread.start() ``` 在这个例子中,我们首先创建了一个线程对象thread,然后创建了一个MyObject对象obj,接着使用obj.moveToThread(thread)将obj对象移动到thread线程中。在obj对象所在的线程中发出mySignal信号,然后使用obj.mySignal.connect(obj.mySlot, Qt.QueuedConnection)将mySignal信号和obj对象的槽函数连接起来,并指定连接方式为Qt.QueuedConnection,即队列连接。最后,将thread.started.connect(obj.mySlot)将thread的started信号与obj的mySlot槽函数连接起来,当thread启动时,会自动执行obj.mySlot槽函数。最后,启动线程thread。 需要注意的是,使用QObject::moveToThread()函数将一个对象移动到另一个线程中时,需要确保该对象的成员变量和方法都是线程安全的。另外,建议在对象的构造函数中将其移动到所属线程中,以便在对象生命周期内始终处于同一线程中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值