Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Vergil Alighieri от Июнь 13, 2016, 08:04



Название: [РЕШЕНО] QTreeWidget + Delegate
Отправлено: Vergil Alighieri от Июнь 13, 2016, 08:04
Здравствуйте, уважаемые форумчане!
Кинул я на свою форму TreeWidget и стал забивать кастомными виджетами. Всегда знал что это медленно, но не мог подумать что отожру одной табличкой с парой сотен записей 100Мб оперативы.
Решил подумать о делегатах, но тема для меня достаточно новая и пока не освоился.
Проблема в том, что в таблице имеются элементы только двух уровней, но для обоих уровней нужен свой кастомный виджет.

Это картинка - как выглядит таблица (и как она должна выглядеть):
(http://i11.pixs.ru/thumbs/0/9/2/Bezimyanni_3574035_22322092.jpg) (http://pixs.ru/showimage/Bezimyanni_3574035_22322092.jpg)

Помогите разобраться с данной тематикой. Буду очень благодарен примерам и советам как нужно и не нужно делать))


Название: Re: QTreeWidget + Delegate
Отправлено: Racheengel от Июнь 13, 2016, 08:56
Ну это QListWidget больше имхо, а не таблица.
А что должно быть виджетом 2 уровня?
Должен ли кконтент быть редактируемым?


Название: Re: QTreeWidget + Delegate
Отправлено: Vergil Alighieri от Июнь 13, 2016, 09:11
А что должно быть виджетом 2 уровня?
Должен ли кконтент быть редактируемым?

Виджет второго уровня - просто составной виджет из лэйблов. Чуть позже они будут раскрашены. И некоторые элементы будут раскрашены по разному, в зависимости от статусов
Контент не редактируемый в таблице. Только формы по контекстным меню и даблкликам)

На счёт того, что это виджет, а не вьюшка - понимаю, но методом инсерта составного виджета в элемент по моему и вьюшка будет отжирать и тупить... Но это лишь предположение))
Опять же с вьюшками не особо то и работал, но понимаю что заполнение модели можно будет вынести адекватно в потоки) Хотя опять же вопрос именно в кастомных виджетах.. не даёт мне покоя кол-во отжираемой памяти, при условии что может быть и больше нескольких тысяч (а то и десятков тысяч) записей


Название: Re: QTreeWidget + Delegate
Отправлено: Racheengel от Июнь 13, 2016, 21:12
Тогда void QAbstractItemView::setItemDelegateForRow(int row, QAbstractItemDelegate *delegate) в помощь.

Переопределяете две штуки QStyledItemDelegate и назначаете их нужным рядам.

Поскольку делегаты только для чтения - надо в них переопределить методы paint(...), в которые будут передаваться индексы текущей ячейки модели, которая рисуется (const QModelIndex &index). По этому индексу достаем данные из модели и рисуем.


Название: Re: QTreeWidget + Delegate
Отправлено: Vergil Alighieri от Июнь 14, 2016, 10:55
Пошёл слегка по другому.
Создал один делегат, унаследованный от QItemDelegate, и переопределил метод paint, вручную отрисовав то, что нужно методами drawRect, drawText и drawLine в зависимости от статусов))
Получилось довольно таки интересно, а самое главное - при очень большом кол-ве записей работает очень быстро и не кушает память)) Виджеты кастомные удалил и радуюсь)
Спасибо за информацию!

К сведению:
На кастомных виджетах в 300-500 записей QTreeWidget кушал от 70 Мб оперативной памяти.
На делегатах в 5000 записей откушал чуть меньше 2 мб)))


Название: Re: QTreeWidget + Delegate
Отправлено: Racheengel от Июнь 14, 2016, 12:33
Это логично, т.к. делегат не имеет своей памяти, а только рисует то, что живет в модели.
А каждый виджет тянет с собой 100500 properties.


Название: Re: QTreeWidget + Delegate
Отправлено: kambala от Июнь 14, 2016, 14:33
можно еще хитрить и отрисовывать прямо готовые виджеты :)


Название: Re: QTreeWidget + Delegate
Отправлено: Vergil Alighieri от Июнь 15, 2016, 03:04
Спасибо всем (особенно Racheengel. Направил в нужное русло)))) Вопрос закрыт и к счастью слегка разобрался с делегатами)