Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Vass от Август 18, 2009, 22:45



Название: QTableView + QAbstractTableModel + 6000 записей + частые обновления = тормоза
Отправлено: Vass от Август 18, 2009, 22:45
Здравствуйте.
В общем проблема такая, пишу что-то типа даунлоад менеджера.
Для каждого поставленного в очередь файла создается строка с названием, прогрессбаром, расчетной скоростью и временем до окончания.
соответственно информация в строке изменяется часто, когда множество мелких файлов, строки инсертятся и ремувяться очень часто, каждый раз необходимо обновлять виджет. Пока файлов не больше сотни все ок, когда же их ~6000 (тестировал на папке с исходниками буста) гуй начинает жутко тормозить, а точнее просто вешается.

Предупреждая вопросы, пробовал вставлять и удалять строки через beginInsertRows/beginRemoveRows, и рефрешить через emit layoutChanged и через reset().
Эффекта нет.

Подскажите пожалуйста выход из ситуации. Возможны любые предложения вплоть до ухода от табловиджета, лишь бы не тормозило.
Спасибо.


Название: Re: QTableView + QAbstractTableModel + 6000 записей + частые обновления = тормоза
Отправлено: BRE от Август 18, 2009, 22:52
Так, мысли вслух.
Может стоит обновлять только видимые строки.


Название: Re: QTableView + QAbstractTableModel + 6000 записей + частые обновления = тормоза
Отправлено: Rcus от Август 18, 2009, 22:52
А профайлер что показывает? Некоторые проблемы с частой отрисовкой решаются ограничением частоты обновлений, проблемы с динамической сортировкой - при помощи таймера. Что за проблема у вас скажет лучше граф профайлера.


Название: Re: QTableView + QAbstractTableModel + 6000 записей + частые обновления = тормоза
Отправлено: spectre71 от Август 18, 2009, 23:06
В дополнение:
Если необходимо обновит диапазон ячек в таблице(emit dataChanged), обновляй по циклу, по ячейкам!
В текущем QT недоработки, если диапазон не 1 ячека, то обнавляется вся видимая область!
Пример:

Код
C++ (Qt)
void MyModel::updateRow(int row) {    
//  emit dataChanged(index(row, 0, QModelIndex()), index(row, columnCount()-1, QModelIndex())); // NO NO NO !!!
 QModelIndex ModelIndex;
 for(int i=0; i<columnCount(); i++) {
   ModelIndex = index(row, i, QModelIndex());
   emit dataChanged(ModelIndex, ModelIndex);
 }
}  


Название: Re: QTableView + QAbstractTableModel + 6000 записей + частые обновления = тормоза
Отправлено: Vass от Август 18, 2009, 23:13
Rcus
Профайлером вот сейчас прохожусь, смотрю.

Spectre
Спасибо за информацию по датачейнджу.