Название: [РЕШЕНО] 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. Направил в нужное русло)))) Вопрос закрыт и к счастью слегка разобрался с делегатами)
|