2013-05-28 3 views
2

У меня есть 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); 

Кто-нибудь есть какие-либо подсказки:

это код, я использую для создания таблицы следующие?

+0

Это простой хак setUniformRowHeights (истина); это поможет вам почти на 50% времени. Я не уверен, почему :) – Midhun

ответ

2

Рассмотрим подклассов QSqlTableModel или QSqlQueryModel для вашей модели таблицы и пусть рамки делать медийные для вас, вместо того, чтобы вручную вставить/набор элементов виджета

[Изменить]: Или напрямую использовать QSqlTableModel в качестве модели таблицы

Ref: Using-QSqlTableModel-To-Display-an-SQL-view, QSQLTableModel inheritor and QTableView, и некоторые примеры кода here

+0

Я не мог найти достойного учебника о том, как расширить эти классы. Поэтому я сконструировал свой проект с помощью классов Q * Widget. Если бы вы могли указать на меня хороший учебник, я буду очень рад переписать все необходимые данные кода и проекта. Qt быстро отдает эту вещь ... может быть, я посмотрю на источники QSqlTableModel. –

 Смежные вопросы

  • Нет связанных вопросов^_^