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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QTreeWidget + Delegate  (Прочитано 7446 раз)
Vergil Alighieri
Гость
« : Июнь 13, 2016, 08:04 »

Здравствуйте, уважаемые форумчане!
Кинул я на свою форму TreeWidget и стал забивать кастомными виджетами. Всегда знал что это медленно, но не мог подумать что отожру одной табличкой с парой сотен записей 100Мб оперативы.
Решил подумать о делегатах, но тема для меня достаточно новая и пока не освоился.
Проблема в том, что в таблице имеются элементы только двух уровней, но для обоих уровней нужен свой кастомный виджет.

Это картинка - как выглядит таблица (и как она должна выглядеть):


Помогите разобраться с данной тематикой. Буду очень благодарен примерам и советам как нужно и не нужно делать))
« Последнее редактирование: Июнь 29, 2016, 09:29 от Vergil Alighieri » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Июнь 13, 2016, 08:56 »

Ну это QListWidget больше имхо, а не таблица.
А что должно быть виджетом 2 уровня?
Должен ли кконтент быть редактируемым?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Vergil Alighieri
Гость
« Ответ #2 : Июнь 13, 2016, 09:11 »

А что должно быть виджетом 2 уровня?
Должен ли кконтент быть редактируемым?

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

На счёт того, что это виджет, а не вьюшка - понимаю, но методом инсерта составного виджета в элемент по моему и вьюшка будет отжирать и тупить... Но это лишь предположение))
Опять же с вьюшками не особо то и работал, но понимаю что заполнение модели можно будет вынести адекватно в потоки) Хотя опять же вопрос именно в кастомных виджетах.. не даёт мне покоя кол-во отжираемой памяти, при условии что может быть и больше нескольких тысяч (а то и десятков тысяч) записей
« Последнее редактирование: Июнь 13, 2016, 09:13 от Vergil Alighieri » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Июнь 13, 2016, 21:12 »

Тогда void QAbstractItemView::setItemDelegateForRow(int row, QAbstractItemDelegate *delegate) в помощь.

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

Поскольку делегаты только для чтения - надо в них переопределить методы paint(...), в которые будут передаваться индексы текущей ячейки модели, которая рисуется (const QModelIndex &index). По этому индексу достаем данные из модели и рисуем.
« Последнее редактирование: Июнь 13, 2016, 21:22 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Vergil Alighieri
Гость
« Ответ #4 : Июнь 14, 2016, 10:55 »

Пошёл слегка по другому.
Создал один делегат, унаследованный от QItemDelegate, и переопределил метод paint, вручную отрисовав то, что нужно методами drawRect, drawText и drawLine в зависимости от статусов))
Получилось довольно таки интересно, а самое главное - при очень большом кол-ве записей работает очень быстро и не кушает память)) Виджеты кастомные удалил и радуюсь)
Спасибо за информацию!

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

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Июнь 14, 2016, 12:33 »

Это логично, т.к. делегат не имеет своей памяти, а только рисует то, что живет в модели.
А каждый виджет тянет с собой 100500 properties.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Июнь 14, 2016, 14:33 »

можно еще хитрить и отрисовывать прямо готовые виджеты Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Vergil Alighieri
Гость
« Ответ #7 : Июнь 15, 2016, 03:04 »

Спасибо всем (особенно Racheengel. Направил в нужное русло)))) Вопрос закрыт и к счастью слегка разобрался с делегатами)
« Последнее редактирование: Июнь 15, 2016, 03:06 от Vergil Alighieri » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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