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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Тормоза selectItem [решено]  (Прочитано 3283 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Сентябрь 23, 2020, 17:50 »

Добрый день

7К айтемов (не так уж много), выборка "вразнобой" (по заданному ключу) замерзает примерно на 7-8 секунд. Профайл показывает: (аттач). Ну merge 30% - то явно обосрались с контейнерами. А вот 40% emitSelectionСhanged я смотрел - там сравнивается старое и новое selection и разница эмиттиться в selectionChanged. И это делается для каждого вызова selectItem, хотя это совсем не нужно, сигналы я откючил (blockSignals).

Как подсунуть ему диапазны selection самому?

Спвсибо
« Последнее редактирование: Сентябрь 24, 2020, 13:00 от Igors » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Сентябрь 24, 2020, 12:37 »

А так если еще:

  setUpdatesEnabled(false);
  ...
  setUpdatesEnabled(true);
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 24, 2020, 12:58 »

А так если еще:

  setUpdatesEnabled(false);
  ...
  setUpdatesEnabled(true);
Не спасает т.к. с рисованием задержка не связана.

Ну, как всегда, в роли "живого хелпа" форум неэффективен Улыбающийся Хотя UI занимаются все-все-все. Ну это нормально. А по теме: да, многократный вызов selectItem тормозит и при "массивных" выборках надо юзать selection напрямую, псевдокод
Код
C++ (Qt)
QItemSelection dst;
dst.reserve(src.size();
auto * model = tree->selectionModel()->model();
 
for (int i = 0; i < src.size(); ++i) {
if (!NeedSelect(&src[i])) continue;
dst.push_back(QItemSelectionRange(model->index(i, 0), model->index(i, numCol - 1)));
}
 
tree->selectionModel()->select(dst, QItemSelectionModel::Select);
 
Имеем 0.25 сек в дебаге
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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