Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Racheengel от Январь 10, 2006, 10:57



Название: Qt 4.1.0: делегаты и иже с ними
Отправлено: Racheengel от Январь 10, 2006, 10:57
Недавно решил перенести одну свою прогу с 3.3.3 на 4.1.0. В проге был большой такой QListView, с кучей итемов. В общем, переделать все это чудо под QTreeWidget не было бы особых проблем, если б не одно НО...
Каждый итем в списке, имея различные типы, должен отрисовываться по-своему, НО вот засада: в Model-View, оказывается, нельзя назначить одному View несколько делегатов для отрисовки  :( Можно только один, общий...
Я так и не понял - это либо регрессия в 4-й версии, т.е. Тролли либо недоглядели, либо еще не добавили такую возможность собственной отрисовки итемов, как это было в 3-й версии, либо... я уже начал стареть и не понимаю каких-то новых веяний в ООП?
Проблему я решил, сделав "фиктивный" делегат, который по индексу определял итем и вызывал его собственную виртуальную функцию отрисовки... А вот теперь думаю - а что, так и нада?


Название: Qt 4.1.0: делегаты и иже с ними
Отправлено: Mikhail от Январь 11, 2006, 21:26
Да, нет так не надо. Дело в том что делегат предназначен для редактирования данных модели а не для отрисовки элемента в представлении. Поработай и создай свой класс представления например от QAbstractItemView.


Название: Qt 4.1.0: делегаты и иже с ними
Отправлено: Racheengel от Январь 12, 2006, 11:10
В том-то и дело, что мне не нужно создавать свой View, я просто хотел расширить существующий. А в доке про делегаты написано "for drawing and editing", насколько я помню...
Просто это ИМХо очень криво - для таких простых вещей свой класс отображения почти с нуля писать. Где же "code less - create more"?


Название: Qt 4.1.0: делегаты и иже с ними
Отправлено: nEoN от Январь 12, 2006, 11:11
Цитата: "Mikhail"
Да, нет так не надо. Дело в том что делегат предназначен для редактирования данных модели а не для отрисовки элемента в представлении. ...

Я бы не согласился. Делегат задуман для взаимодействия элемента модели с GUI, в том числе и для отрисовки элемента. Для этого существует виртуальный метод QAbstractItemDelegate::paint ( ..., const QModelIndex & index ), который и должен заниматься отрисовкой отдельного элемента модели.


Название: Qt 4.1.0: делегаты и иже с ними
Отправлено: Racheengel от Январь 12, 2006, 11:29
Все верно. Но вопрос в чем - как заставить (правильно) разные элементы отрисовываться и редактироваться по-своему, если на одно отображение модно повесить только один делегат?


Название: Qt 4.1.0: делегаты и иже с ними
Отправлено: nEoN от Январь 12, 2006, 11:53
Цитата: "Racheengel"
Все верно. Но вопрос в чем - как заставить (правильно) разные элементы отрисовываться и редактироваться по-своему, если на одно отображение модно повесить только один делегат?

По моему может быть только два варианта :
1) сам делегат отображает элементы, анализируя их тип.
2) как ты написал в первом посте, делегат выступает связующим звеном между представлением и элементами, вызывая из своих методов отрисовки/редактирования их аналоги  - виртуальные методы элементов.


Название: Qt 4.1.0: делегаты и иже с ними
Отправлено: Racheengel от Январь 12, 2006, 12:26
Ну да, я так и сделал... Просто более лучшего ничего не нашел.