Qt MVC: ненависти псто!

Вот есть такой Qt. А в нем полноценный Model-View: QAbstractItemModel (и потомки), QAbstractItemView (и потомки) ну и "контроллер", то есть делегат.

И вот допустим мы отображаем некий список (произведя его из QListItemModel) в некоем вью (произведя его из QListView). Стандартные средства - хороши, пока их хватает. Иконка, подпись, чекбокс, все есть. Раскраска - стайлшитом.

Идем дальше, стандартных средств не хватает, хотим нарисовать полоску/иконку/хреновинку. Ну отлично, QStyledItemDelegate, базовый класс нарисует основу, мы потом разукрасим.

Правда выясняется, что оформление удобно раздать из модели данных. В частности, вот размер всей фигни - это Qt::SizeHintRole, ее читает QStyledItemDelegate и рисует рамочки там, то-се.

Идем дальше: одна модель, два вью. Достаточно сильно отличающиеся, ну там "большие иконки и маленькие". Все, трындец, приплыли: SizeHintRole - это свойство модели данных, а не view или делегата.

Нет, можно извратиться: встроиться в QStyledItemDelegate::initStyleOptions и полученное из модели - отрихтовать. Но это, явно, не предусмотренный конструкцией путь.

И если для ~95% нужного мне - я могу встроить это нужное в параметры делегата, то вот SizeHintRole, FontRole - нет (ну и две разные иконки таскать - тоже нет).

И я не понимаю, как предлагается выходить из ситуации авторами Qt. Я вот - не ленивый и "оформительскую" часть данных засунул в QIdentityProxyModel (наследника) и хожу к данным через прокси. Но иметь разное пространство индексов в View и в данных - неудобно.

А как надо?

Comments

Additional ProxyModel just to overwrite that :data calls.

Ну я ровно это и написал в последнем абзаце.

Но как-то это криво. То есть by design мы носим оформление вместе с данными (SizeHintRole, BackgroundRole и так далее). Ну, допустим, в простых типовых случаях - это проще (но не правильнее).

Не хватает стандартного (!) механизма оверрайда этих ролей на уровне Delegate, чтобы таки отделить данные от оформления.

Это да. Но менее стандартным способом оно от этого не становится :(

Ну вот в результате я даже часть stylesheets вынужден нести через data(), потому что вот блин.

Не надо так!