0%

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

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

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

原代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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()

错误信息:

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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