Russian Qt Forum
Октябрь 03, 2024, 05:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView + QAbstractTableModel + 6000 записей + частые обновления = тормоза  (Прочитано 4424 раз)
Vass
Гость
« : Август 18, 2009, 22:45 »

Здравствуйте.
В общем проблема такая, пишу что-то типа даунлоад менеджера.
Для каждого поставленного в очередь файла создается строка с названием, прогрессбаром, расчетной скоростью и временем до окончания.
соответственно информация в строке изменяется часто, когда множество мелких файлов, строки инсертятся и ремувяться очень часто, каждый раз необходимо обновлять виджет. Пока файлов не больше сотни все ок, когда же их ~6000 (тестировал на папке с исходниками буста) гуй начинает жутко тормозить, а точнее просто вешается.

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

Подскажите пожалуйста выход из ситуации. Возможны любые предложения вплоть до ухода от табловиджета, лишь бы не тормозило.
Спасибо.
Записан
BRE
Гость
« Ответ #1 : Август 18, 2009, 22:52 »

Так, мысли вслух.
Может стоит обновлять только видимые строки.
Записан
Rcus
Гость
« Ответ #2 : Август 18, 2009, 22:52 »

А профайлер что показывает? Некоторые проблемы с частой отрисовкой решаются ограничением частоты обновлений, проблемы с динамической сортировкой - при помощи таймера. Что за проблема у вас скажет лучше граф профайлера.
Записан
spectre71
Гость
« Ответ #3 : Август 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);
 }
}  
Записан
Vass
Гость
« Ответ #4 : Август 18, 2009, 23:13 »

Rcus
Профайлером вот сейчас прохожусь, смотрю.

Spectre
Спасибо за информацию по датачейнджу.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.134 секунд. Запросов: 20.