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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable  (Прочитано 3984 раз)
cheqa
Гость
« : Октябрь 09, 2013, 20:52 »

Доброго вечера.
Имеется следующая ситуация: QTreeWidget с 10000+ элементов.
Предыдущая версия интерфейса содержала элементы без квадратика чекбокса. Сейчас понадобилось сделать так, чтобы чекбоксы у элементов были.
В одном месте программы происходит итерирование по всем элементам и сброс флага Qt::ItemIsUserCheckable в false. Заметил, что длительность этой операции почти линейно зависит от количества элементов - при 1000 занимает 10 миллисекунд на один сброс флага (умножаем на количество элементов), на 10000 - уже 100. Что-то оно там пересчитывает, геометрию, что-ли. Понятно, что если тратить по 100 миллисекунд для сброса флага у 10000+ элементов - то никакого терпения не хватит дождаться конца операции.
Задача у меня простая: при выполнении определённых условий "заморозить" состояние элементов - чтобы их можно было скроллить, даблкликать итд, но нельзя было бы поднимать-опускать флаги. Я хотел решить этот вопрос в лоб - и получил по лбу.
Уважаемое сообщество, каким образом можно решить задачу в моей постановке? И можно ли запретить при установке/сбросе флага пересчитывать геометрию всех остальных элементов?
Спасибо.
Записан
_OLEGator_
Гость
« Ответ #1 : Октябрь 09, 2013, 20:57 »

Для больших объемов данных рекомендуется использовать QTreeView.
Записан
cheqa
Гость
« Ответ #2 : Октябрь 09, 2013, 21:01 »

Для больших объемов данных рекомендуется использовать QTreeView.
Да, я в курсе, спасибо. Просто вот так вот было сделано, и переделывать пока времени и желания нет. Собственно, с таким количеством элементов Виджет справляется вполне приемлимо - если бы не вот это вот недоразумение.

Собственно, нашёл промежуточное решение - для начала схлопнуть все айтемы верхнего уровня - потом переменить флаги - а потом расхлопнуть их обратно.
Записан
_OLEGator_
Гость
« Ответ #3 : Октябрь 09, 2013, 21:16 »

Можно еще это попробовать
Код
C++ (Qt)
QWidget::setUpdatesEnabled ( bool enable )
Записан
cheqa
Гость
« Ответ #4 : Октябрь 09, 2013, 21:37 »

Можно еще это попробовать
Код
C++ (Qt)
QWidget::setUpdatesEnabled ( bool enable )
Вот, спасибо, мне кажется, именно это я и искал... Сейчас попробую.
Записан
cheqa
Гость
« Ответ #5 : Октябрь 09, 2013, 21:51 »

Можно еще это попробовать
Код
C++ (Qt)
QWidget::setUpdatesEnabled ( bool enable )
К сожалению, помогает только помещение всех айтемов в единого родителя и его сворачивание. Тогда - быстро. setUpdatesEnabled никакого эффекта не дают.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Октябрь 10, 2013, 07:35 »

К сожалению, помогает только помещение всех айтемов в единого родителя и его сворачивание. Тогда - быстро. setUpdatesEnabled никакого эффекта не дают.
Что и не удивительно, т.к. тормозит не отрисовка, а просто до неприличия ужасно тормозная реализация дерева в QTreeWidgetModel (в QStandardItemModel аналогично).
Кроме как реализовать свою модель, ничего тут не предложишь Грустный
Записан

Qt 5.11/4.8.7 (X11/Win)
cheqa
Гость
« Ответ #7 : Октябрь 10, 2013, 08:23 »

Что и не удивительно, т.к. тормозит не отрисовка, а просто до неприличия ужасно тормозная реализация дерева в QTreeWidgetModel (в QStandardItemModel аналогично).
Кроме как реализовать свою модель, ничего тут не предложишь Грустный
Эхх... когда-нибудь, когда будет время... Спасибо за совет!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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