Название: 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 Ну да, я так и сделал... Просто более лучшего ничего не нашел.
|