pyqt使用QThread在tableview上添加列

时间:2017-06-21 04:22:24

标签: python multithreading pyqt qthread

我在使用线程在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线程。)

我该如何解决这个问题?

0 个答案:

没有答案