我在使用线程在qtableview中添加行以防止GUI阻塞时遇到了一些问题。行数非常大。 (可能是1800~3000,每行都有由大数据图组成的图。)因此,如果我不使用QThread,只需预测主GUI线程是通过添加大量行来阻止的。是的,到目前为止一切都很好。
所以我在上面实现了解决我提到的问题,但问题仍然存在。
class ColumnTableView(MyTableView):
HistogramColumnNum = 3
def __init__(self. *args, **kwargs)
MyTableView.__init__(*args, **kwargs)
def beginInsertMode(self, mIdx, sIdx, eIdx):
self.model().beginResetModel()
def endInsertMode(self):
self.model().endResetModel()
def setData(self, data, ):
if data is None:
return
data = data['outputs']
keys = list(data.keys())
try:
data = data[keys[0]]
except:
return
self.wholeData = data
model = self.model()
model.items = []
self.reset()
if data is not None:
dqData = data
model.beginResetModel()
model.endResetModel()
self.worker.requestBeginInsertMode.connect(self.beginInsertMode)
self.worker.requestEndInsertMode.connect(self.endInsertMode)
self.worker.setData(data, model)
self.worker.start()
class Worker(QThread):
requestBeginInsertMode = pyqtSignal()
requestEndInsertMode = pyqtSignal()
def __init__(self, parent=None):
QThread.__init__(self, parent)
self.data = None
self.model = None
def setData(self, data, model):
self.model = model
self.data = data
def run(self):
data = self.data.npData
model = self.model
cols = data.shape[1]
for idx in range(cols):
print(idx)
col = data[:, idx]
item = Column(str(self.data.header[idx]), str(col.dtype), str(countOmissionData(col)), col)
model.addColumn(item)
self.requestEndInsertMode.emit()
class ColumnModel(QAbstractTableModel):
def __init__(self):
super(ColumnModel, self).__init__()
def rowCount(self, index=QModelIndex()):
if not self.items:
return 0
else:
return len(self.items)
def addColumn(self, column):
self.items.append(column)
所以我实现了实际添加行的多线程(在我的代码中命名为Column。抱歉令人困惑。)但它不起作用(添加列仍然阻止主GUI线程。)
我该如何解决这个问题?