Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: cheqa от Октябрь 09, 2013, 20:52



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


Название: Re: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable
Отправлено: _OLEGator_ от Октябрь 09, 2013, 20:57
Для больших объемов данных рекомендуется использовать QTreeView.


Название: Re: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable
Отправлено: cheqa от Октябрь 09, 2013, 21:01
Для больших объемов данных рекомендуется использовать QTreeView.
Да, я в курсе, спасибо. Просто вот так вот было сделано, и переделывать пока времени и желания нет. Собственно, с таким количеством элементов Виджет справляется вполне приемлимо - если бы не вот это вот недоразумение.

Собственно, нашёл промежуточное решение - для начала схлопнуть все айтемы верхнего уровня - потом переменить флаги - а потом расхлопнуть их обратно.


Название: Re: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable
Отправлено: _OLEGator_ от Октябрь 09, 2013, 21:16
Можно еще это попробовать
Код
C++ (Qt)
QWidget::setUpdatesEnabled ( bool enable )


Название: Re: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable
Отправлено: cheqa от Октябрь 09, 2013, 21:37
Можно еще это попробовать
Код
C++ (Qt)
QWidget::setUpdatesEnabled ( bool enable )
Вот, спасибо, мне кажется, именно это я и искал... Сейчас попробую.


Название: Re: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable
Отправлено: cheqa от Октябрь 09, 2013, 21:51
Можно еще это попробовать
Код
C++ (Qt)
QWidget::setUpdatesEnabled ( bool enable )
К сожалению, помогает только помещение всех айтемов в единого родителя и его сворачивание. Тогда - быстро. setUpdatesEnabled никакого эффекта не дают.


Название: Re: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable
Отправлено: GreatSnake от Октябрь 10, 2013, 07:35
К сожалению, помогает только помещение всех айтемов в единого родителя и его сворачивание. Тогда - быстро. setUpdatesEnabled никакого эффекта не дают.
Что и не удивительно, т.к. тормозит не отрисовка, а просто до неприличия ужасно тормозная реализация дерева в QTreeWidgetModel (в QStandardItemModel аналогично).
Кроме как реализовать свою модель, ничего тут не предложишь :(


Название: Re: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable
Отправлено: cheqa от Октябрь 10, 2013, 08:23
Что и не удивительно, т.к. тормозит не отрисовка, а просто до неприличия ужасно тормозная реализация дерева в QTreeWidgetModel (в QStandardItemModel аналогично).
Кроме как реализовать свою модель, ничего тут не предложишь :(
Эхх... когда-нибудь, когда будет время... Спасибо за совет!