每次迭代循环更新QTableWidget行

时间:2017-01-07 10:36:58

标签: python-3.x pyqt5 qtablewidget

我希望在每次循环迭代时同时更新QTableWidget,因为行已插入表格中

我需要这样做,因为如果我等待在循环结束后显示更改,那么几乎要永远这样做,因为有数百行被插入表中所以我想看到表中的行是插入循环的每次迭代。

以下是表格定义

    self.tableResults = QtWidgets.QTableWidget(self)
    self.tableResults.setGeometry(10, 10, 580, 300)
    self.tableResults.setColumnCount(7)
    self.tableResults.setHorizontalHeaderLabels(["Game Number" , "Game Name" , "Date" , "First" , "Second" , "Third" , "Fourth"])
    self.tableResults.setUpdatesEnabled(True)

按下按钮时会触发循环,它也会冻结整个GUI

事件处理程序的定义如下:

def btnStartClick(self):

    startYear = self.startDatePicker.date().year();
    startMonth = self.startDatePicker.date().month();
    startDay = self.startDatePicker.date().day();
    startDate = date(startYear,startMonth,startDay)

    endYear = self.endDatePicker.date().year();
    endMonth = self.endDatePicker.date().month();
    endDay = self.endDatePicker.date().day();
    endDate = date(endYear,endMonth,endDay)

    delta = endDate - startDate
    gameResults = []
    for i in range(delta.days + 1):
        tdate = startDate + td(days=i)
        resultDate = tdate.strftime("%m/%d/%y")
        results = getResults(resultDate)

        for gameId in results:
            self.tableResults.insertRow(self.tableResults.rowCount())
            gameResult = getGameResult(gameId,date)

            self.tableResults.model().setItem(self.tableResults.rowCount() , 0 , QtWidgets.QTableWidgetItem(str(gameResult.gameNumber)))
            self.tableResults.model().setItem(self.tableResults.rowCount() , 1 , QtWidgets.QTableWidgetItem(str(gameResult.gameName)))
            self.tableResults.model().setItem(self.tableResults.rowCount() , 2 , QtWidgets.QTableWidgetItem(str(gameResult.date)))
            self.tableResults.model().setItem(self.tableResults.rowCount() , 3 , QtWidgets.QTableWidgetItem(str(gameResult.first)))
            self.tableResults.model().setItem(self.tableResults.rowCount() , 4 , QtWidgets.QTableWidgetItem(str(gameResult.second)))
            self.tableResults.model().setItem(self.tableResults.rowCount() , 5 , QtWidgets.QTableWidgetItem(str(gameResult.third)))
            self.tableResults.model().setItem(self.tableResults.rowCount() , 6 , QtWidgets.QTableWidgetItem(str(gameResult.fourth)))
            gameResults.append(gameResult)

    print(gameResults)

1 个答案:

答案 0 :(得分:1)

重要信息:

使用QTableWidget解决方案不起作用。因此,这里显示了如何更改代码以加速和使用QTableWidget。

说明

因为您无法使用QTableWidget一次添加几行,所以需要使用QTableView。这里的重要区别是您可以选择项目模型以满足您的需求。这里选择了QStandardItemModel,因为它支持缺少的函数appendRow(...)。这就是我们想要的,因为在插入几个项目之后调用paint事件,而不是在插入或编辑项目之后调用它。

之前需要的代码
self.tableResults = QTableView(self);
self.tableResults.setModel(QStandardModel(0, 7, self));

其他信息:

QTableView类需要一个继承自QAbstractItemModel的类,因为此类管理数据。因此,要使用QTableView,需要设置项目模型。

为什么选择QStandardModel? QStandardModel类提供了更多功能,可以帮助一次添加多个项目。

更改了代码

def btnStartClick(self):

    startYear = self.startDatePicker.date().year();
    startMonth = self.startDatePicker.date().month();
    startDay = self.startDatePicker.date().day();
    startDate = date(startYear,startMonth,startDay)

    endYear = self.endDatePicker.date().year();
    endMonth = self.endDatePicker.date().month();
    endDay = self.endDatePicker.date().day();
    endDate = date(endYear,endMonth,endDay)

    delta = endDate - startDate
    gameResults = []
    for i in range(delta.days + 1):
        tdate = startDate + td(days=i)
        resultDate = tdate.strftime("%m/%d/%y")
        results = getResults(resultDate)
        for gameId in results:
            List row;

            gameResult = getGameResult(gameId,date)
            row.append(QtWidgets.QStandardItem(str(gameResult.gameNumber)))
            row.append(QtWidgets.QStandardItem(str(gameResult.gameName)))
            row.append(QtWidgets.QStandardItem(str(gameResult.date)))
            row.append(QtWidgets.QStandardItem(str(gameResult.first)))
            row.append(QtWidgets.QStandardItem(str(gameResult.second)))
            row.append(QtWidgets.QStandardItem(str(gameResult.third)))
            row.append(QtWidgets.QStandardItem(str(gameResult.fourth)))
            (self.tableResults.model()).appendRow(row); #maybe a cast to this class is needed QStandardItemModel. It's python so I'm not sure
            gameResults.append(gameResult)

    print(gameResults)