最近刚开始学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
34list=[...]
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 | QObject::connect: Cannot queue arguments of type 'QVector<int>' |
注释掉添加Item的那一行就不会报错了,而且报错了还是能修改成功
搜了一圈之后,基本都是Qt的代码,说需要用 qRegisterMetaType 注册 QVector
1 | #include <QMetaType> |
但是pyqt下似乎没有qRegisterMetatType这个方法,并且看到这个贴:
关于线程中调用QStandardItemModel设置列表信息的问题
代码要实现的功能类似,但是说 qRegisterMetaType 注册后又报其他错,便放弃了这个这条路- -
然后选择定义信号和槽,当所有线程执行完fun_1后,发射一个信号,槽接受到信号后添加Item
1 | list=[...] |