【问题标题】:Update QTableWidget rows with each iteration of loop每次循环迭代更新 QTableWidget 行
【发布时间】:2017-01-07 10:36:57
【问题描述】:

我想在每次循环迭代时同时更新 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。到目前为止,我知道 python 很适合编程,但性能更差。
  • 这是因为有一个停止按钮也可以在需要时停止此操作,所以如果按下停止按钮,它需要显示插入的行。
  • @ArthurM。不,插入所有行并什么都不显示是不是要花很长时间
  • 我是否理解正确,当时所有数据都可用?
  • 我想说的是,在使用 setItem() 方法在表中设置项目后,它应该在应用程序执行时显示插入到 GUI 中的单元格。

标签: python-3.x pyqt5 qtablewidget


【解决方案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)

【讨论】:

  • @ArtherM 我查看了您的解决方案,但它出现在 pyqt 中,没有可用的 QList 和 .append() 方法是否有任何其他方法可以加快进程..
  • 我认为 .appendRow() 方法仅适用于 c++ 不适用于 python
  • 我更改了整个答案以更正它并简化阅读。
最近更新 更多