每次循环迭代更新 QTableWidget 行

问题描述 投票:0回答:2

当在表中插入一行时,我想在每次循环迭代时同时更新 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)
python-3.x pyqt5 qtablewidget
2个回答
1
投票

重要信息:

使用 QTableWidget,该解决方案不起作用。因此,这里展示了如何更改代码以提高速度和使用 QTableWidget。

说明

因为您无法使用 QTableWidget 一次添加几行,所以需要使用 QTableView。这里的重要区别是您可以选择适合您需求的项目模型。这里选择 QStandardItemModel 因为它支持缺失的函数

appendRow(...)
。这就是我们想要的,因为绘制事件是在插入几个项目之后调用的,而不是像以前那样在插入或编辑项目之后调用。

之前需要代码

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)

0
投票

我用QtWidgets.QListView的repaint()方法解决了它

self.listView = QtWidgets.QListView()
self.model = QStandardItemModel()
self.listView.setModel(self.model)
for i in range(10):
    item = QStandardItem(QIcon('pdf.png'), "txt string")
    self.model.appendRow(item)
    self.listView.repaint()
    time.sleep(1) 
© www.soinside.com 2019 - 2024. All rights reserved.