Reputation: 307
I want to simultaneously update the QTableWidget with each iteration of loop as a row is inserted in the table
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.
Here is the table definition
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)
The loop is triggered when a button is pressed and it also freezes the whole GUI
The definition of the event handler is as follows:
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)
Upvotes: 0
Views: 2335
Reputation: 1
I solved it with the repaint()
method of QtWidgets.QListView
:
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)
Upvotes: 0
Reputation: 634
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.
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));
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.
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)
Upvotes: 1