При использовании setCellWidget()
в PyQT5 на QTableWidget()
у меня возникают проблемы с производительностью. Как только моя for
-l oop содержит около 100 записей, поступающих из базы данных SQL, задержка становится заметной. Около 500 записей задержка занимает до 3 секунд.
Я отключил часть setCellWidget()
и протестировал 20 000 записей, и задержка едва ли была. Таким образом, выполнение и получение запроса не задерживает код.
self.queueTable
- это QTableWidget () из 8 столбцов и столько же строк, сколько возвращено запросом, хранящимся в переменной tasks
Вот код, который я использовал:
def buildQueueInUI(self):
global userAccount
.....
tasks = Query(SQLconn, 'SQLITE', False).readParameterized(QueryStrings.myQueuedJobsList, [userAccount])
for row in tasks:
rowPosition = self.queueTable.rowCount()
self.queueTable.insertRow(rowPosition)
btt=QPushButton('DELETE')
btt.clicked.connect(cancelTask)
self.queueTable.setCellWidget(rowPosition, 0, btt) ##turning this into a comment fixes the slowdown issue
self.queueTable.setItem(rowPosition, 1, Tables.noEditTableWidget(self, str(row[0])))
self.queueTable.setItem(rowPosition, 2, Tables.noEditTableWidget(self, str(row[2])))
....
Я читал, что QPushButton
«дорогой» ( Зачем получать Python с PyQt5 медленным при создании большого количества QPushButtons? ), но проблема остается при использовании другие виджеты, такие как комбинированный список (пример непрактичного кода с комбинированным списком :)
def buildQueueInUI(self):
global userAccount
.....
tasks = Query(SQLconn, 'SQLITE', False).readParameterized(QueryStrings.myQueuedJobsList, [userAccount])
for row in tasks:
rowPosition = self.queueTable.rowCount()
self.queueTable.insertRow(rowPosition)
combo = QComboBox()
combo.addItem("keep")
combo.addItem("remove")
self.queueTable.setCellWidget(rowPosition, 0, combo) ##turning this into a comment fixes the slowdown issue
self.queueTable.setItem(rowPosition, 1, Tables.noEditTableWidget(self, str(row[0])))
self.queueTable.setItem(rowPosition, 2, Tables.noEditTableWidget(self, str(row[2])))
....
Только без выполнения вызова setCellWidget()
на QTableWidget
с QPushButton()
или QComboBox()
I может сделать таблицу без задержек.
В типичном сценарии использования было бы около 500 - 750 задач в очереди. Как я могу получить QPushButton()
без задержек, вызванных setCellWidget()
? У меня уже есть слушатель cellDoubleClicked.connect
и настраиваемое контекстное меню на table`, так что это не вариант.
Моя система:
- Python 3.7
- PYQT5 5.14.1
- Windows 10 64 бит