Previous Entry Share Next Entry
MVC -> type mapping
zamotivator wrote in ru_qt
Здравствуйте, уважаемые сообщники.
Я не смог найти приемлимого решения моей проблемы ни в mailing list, ни в примерах, ни в документации.

Я пишу тонкий клиент, который по rpc запрашивает данные от сервера. В нём несколько десятков различных моделей, но все они представимы в виде таблиц.
Я хочу сделать назначить каждому типу данных в модели свой widget.

Например, я хочу, чтобы для ячеек типа bool рисовался check box, для моего типа данных progress - мой widget progress bar. Также я хочу, чтобы эти widget'ы редактировали данные.

Если сделать делегат - то я могу создавать нужный мне редактор (QCheckBox как пример), и назначать его для редактирования данных. После этого при редактировании ячейки появляется вожделенный QCheckBox, отрабатывает вызов Model::setData, всё хорошо.
Класс QItemEditorFactory позволяет сделать желаемое - отобразить типы в редакторы.
Но рисуется тип данных bool по-прежнему текстом - "true" или "false". А я хочу его всегда check box'ом видеть. Нету ли какого-нибудь QItemViewFactory для отображения?
Научить делегат рисовать как я хочу проблематично - paint служит для других целей (об этим пишут и разработчики Qt в рассылке), разработчики Qt советуют делать setIndexWdget.
Однако когда я делаю setIndexWidget, у меня перестаёт вызываться мой делегат.

Что же делать? Каждой модели, каждой ячейке делать setWidgetItem, подключать сигналы-слоты, обрабатывать их потом? Это очень неудобно, куча лишнего кода.
Или рисовать в делегате руками CheckBox'ы и прочие контролы? Тоже неудобно.

Подскажите, пожалуйста, какие вы видите пути решения проблемы.

  • 1
Я бы нарисовал контролы делегатом. Это не сложно. Но если не подходит, то можно посмотреть в сторону QAbstractItemView::openPersistentEditor()

А если вместо таблицы использовать QGridLayout и помещать конкретный Widget в него и установить flat style?

А как же MVC? Мне MVC нужен. Моделей дофига, хочу настроить один раз View, и цеплять инстансы view ко всем своим моделям (type mapping - самое удобное, что могу придумать).

Я, кстати, нашёл решение - UserCheckable, UserCheckRole.
Вполне устраивает

А свой вид сделать, который на основе QGridLayout отображать будет?

Это не объясняет, каким образом мне рисовать check box.
Руками? Я не могу создать check box и попросить его нарисоваться вооот на этом painter'е. Ему нужно QPaintEvent формировать. Ты не устанешь это делать?
Плюс это хаки.

ЛИБО руками рисовать checkbox - это вообще хак и мимо

Зачем руками? Можно через QStyle::drawControl()

  • 1
?

Log in