当在表中插入一行时,我想在每次循环迭代时同时更新 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)
使用 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)
我用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)