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

最近刚开始学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'
(Make sure 'QVector' is registered using qRegisterMetaType().)

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

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

#include 
qRegisterMetatType>("QVector");

但是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

你可能感兴趣的:(pyqt5)