У меня есть QtTableWidget
с 7 столбцами и множеством строк (что-то вроде 2000, но будет расти до 5000 и, возможно, даже больше).Как ускорить QTableWidget
Эти данные извлекаются из базы данных. Запрос и почтовая обработка заняли менее 100 мс, так что это не проблема.
Но вставка предметов за столом занимает много времени (примерно 30 секунд) для 7x2000 предметов.
Я попытался оптимизировать код настолько, насколько мог, но я больше не знаю, что делать.
Кроме того, я должен отметить, что при запуске приложения эта же таблица с тем же набором данных загружается и очень быстро. Поэтому я считаю, что это проблема рендеринга.
Поиск в документах для чего-то, что блокирует рендеринг, я придумал метод setUpdatesEnabled
, который не помогает вообще.
setUpdatesEnabled(false);
blockSignals(true);
bool sort = isSortingEnabled();
setSortingEnabled(false);
// rebuild headers.
buildHeaders(); // take less than 1ms.
// rebuild grid.
int oldRowCount = rowCount();
setRowCount(sml->length()); // take less than 1ms.
ListIterator<StoredMetadata> it(sml); // sml is a list with the data to be displayed.
int row = 0;
while (it.hasNext()) {
AudioLife::StoredMetadata *sm = it.next();
if (row >= oldRowCount) {
setItem(row, 0, new QTableWidgetItem(sm->artist));
setItem(row, 1, new QTableWidgetItem(sm->album));
setItem(row, 2, new QTableWidgetItem(sm->name));
setItem(row, 3, new QTableWidgetItem(sm->number > 0 ? QString().setNum(sm->number) : ""));
setItem(row, 4, new QTableWidgetItem(sm->year > 0 ? QString().setNum(sm->year) : ""));
setItem(row, 5, new QTableWidgetItem(sm->genre));
// commenting the following line does not improve performance.
verticalHeader()->resizeSection(row, defaultRowHeight());
} else {
item(row, 0)->setText(sm->artist);
item(row, 1)->setText(sm->album);
item(row, 2)->setText(sm->name);
item(row, 3)->setText(sm->number > 0 ? QString().setNum(sm->number) : "");
item(row, 4)->setText(sm->year > 0 ? QString().setNum(sm->year) : "");
item(row, 5)->setText(sm->genre);
}
item(row, 0)->setData(Qt::UserRole, QVariant(sm->id));
row++;
}
setUpdatesEnabled(true);
blockSignals(false);
setSortingEnabled(sort);
Кто-нибудь есть какие-либо подсказки:
это код, я использую для создания таблицы следующие?
Это простой хак setUniformRowHeights (истина); это поможет вам почти на 50% времени. Я не уверен, почему :) – Midhun