每次循环迭代更新 QTableWidget 行 [英] Update QTableWidget rows with each iteration of loop

查看:116
本文介绍了每次循环迭代更新 QTableWidget 行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当一行插入到表中时,我想在每次循环迭代中同时更新 QTableWidget

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

I need that because if I wait for for changes to show up after the loop ends it takes almost forever to do that because there are hundreds of rows are being inserted into the table so I want to see the rows in the table being inserted with each iteration of the loop.

这里是表定义

    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

The loop is triggered when a button is pressed and it also freezes the whole 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)

推荐答案

重要信息:

使用 QTableWidget 解决方案不起作用.所以这里展示了如何更改代码以加快速度和使用 QTableWidget.

Important information:

With a QTableWidget the solution doesn't work. So here is shown how the code must be changed for speed-up and for using a QTableWidget.

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

Because you can't add a couple of rows at once with a QTableWidget it's needed to take the QTableView. The important difference here is that you can choose the item model to suit your needs. Here a QStandardItemModel is chosen because it supports the missing function appendRow(...). This is what we want because the paint event is called after a couple of items are inserted and not as before after an item has been inserted or edited.

self.tableResults = QTableView(self);
self.tableResults.setModel(QStandardModel(0, 7, self));

附加信息:

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

Additional information:

The QTableView class needs a class which inherits from QAbstractItemModel because this class manages the data. So to use QTableView it's needed to set an item model.

为什么选择 QStandardModel?QStandardModel 类提供了更多有助于一次添加多个项目的功能.

Why QStandardModel? The QStandardModel class provides more functions which help add multiple items at once.

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)

这篇关于每次循环迭代更新 QTableWidget 行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆