Название: 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 Можно еще это попробовать
Код
Название: Re: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable Отправлено: cheqa от Октябрь 09, 2013, 21:37 Можно еще это попробовать Вот, спасибо, мне кажется, именно это я и искал... Сейчас попробую.Код
Название: Re: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable Отправлено: cheqa от Октябрь 09, 2013, 21:51 Можно еще это попробовать К сожалению, помогает только помещение всех айтемов в единого родителя и его сворачивание. Тогда - быстро. setUpdatesEnabled никакого эффекта не дают.Код
Название: Re: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable Отправлено: GreatSnake от Октябрь 10, 2013, 07:35 К сожалению, помогает только помещение всех айтемов в единого родителя и его сворачивание. Тогда - быстро. setUpdatesEnabled никакого эффекта не дают. Что и не удивительно, т.к. тормозит не отрисовка, а просто до неприличия ужасно тормозная реализация дерева в QTreeWidgetModel (в QStandardItemModel аналогично).Кроме как реализовать свою модель, ничего тут не предложишь :( Название: Re: QTreeWidgetItem - медленно убирает флаг Qt::ItemIsUserCheckable Отправлено: cheqa от Октябрь 10, 2013, 08:23 Что и не удивительно, т.к. тормозит не отрисовка, а просто до неприличия ужасно тормозная реализация дерева в QTreeWidgetModel (в QStandardItemModel аналогично). Эхх... когда-нибудь, когда будет время... Спасибо за совет!Кроме как реализовать свою модель, ничего тут не предложишь :( |