Как стать автором
Обновить
-16
0

C++ Software Engineer

Отправить сообщение
Я могу заполнять и одной строчкой кода, если все остальное используется по умолчанию. А модель самая обычная, самое главное чтобы там были столбцы типа int для ключа БД и QString для отображения.
А если таких виджетов много, то можно и фабрику под это дело использовать. Это уже вопрос уровня абстракций.

Насколько я понимаю вы сделали свою реализацию QComboBox — BaseKeyComboBox. Он использует простую модель типа QSqlQueryModel. Я использую простой QComboBox. Но сделал для него особенную модель из QSqlQueryModel.
В обоих случаях нам надо добавлять в проект два лишних файла. С примерно одинаковым количеством кода. И в обоих случаях это даёт заполнение QComboBox данными одной строчкой кода.
Теперь о том чего нельзя сделать в вашем варианте. Если посмотреть шире то модель она не только для данных. Через наследника модели можно определить всплывающую подсказку(tooltip), шрифт пункта и ещё много чего перечисленного в enum ItemDataRole (qnamespace.h).
В частности, хотел в своё время запрашивать из базы три столбца вместо двух. Что бы третий выводился как ToolTipRole первого столбца модели. Именно поэтому у меня название параметра columns в BaseComboModel.
QDataWidgetMapper и должен работать с тем, что показывается пользователю. Никто же не делает несколько пунктов с одинаковым содержимым 'Пункт1, Пункт1', или я смысл не уловил…

Может я не так объяснил. Попробую по другому.
Например что там, в конструкторе, может произойти?
Починил, пробуйте.
Причем я не понял зачем делать модель специально для этого случая.

Вот вы заполняете комбобокс пятью строчками кода плюс незнаю что там в модели. А я это делаю одной строкой. Когда комбобоксов от 10-и в программе. Есть над чем задуматься.
И я не увидел, он у вас с QDataWidgetMapper умеет работать?

Нет. Дело в том что мой комбобокс обязан устанавливать значения по вторичному ключу БД из Qt::UserRole. А QDataWidgetMapper работает со строкой из Qt::DisplayRole. К тому же этот маппер работает через раз.
Если у вас есть пара часов свободного времени. Можете ознакомиться как этот комбобокс сохраняет и заполняет значения из БД — https://habrahabr.ru/post/328670/
Грубо говоря я написал свою замену QDataWidgetMapper
Добавление пустых строчек-заменителей делается всё на стандартных моделях без зауми. QSqlQueryModel

Пустые строчки можно делать и SQL запросом, согласен. Хотя если брать ваш UNION. То как быть в случае когда второй столбец будет иметь какой то другой тип данных? Переписать запрос?! В том то и дело что модели всё равно на конфликт типов данных с SQL запросом.
В чём магия создания моделей именно для QComboBox — не раскрыто.

В том то и дело что тут нет никакой магии. Всё проще простого. Смотрите код. Причём модель для таблицы можно подать в комбобокс и наоборот.
Как вставлять отличные от QListView отображения в QComboBox и пользовать их — не сказано.

А я обещал осветить именно эту тему?! Я обещал заполнять контентом комбобоксы одной строчкой кода. И показал.
Решается это так: QTableView c указанной QSqlQueryModel. Но там надо назначить делегаты которые будут отображать комбобоксы при редактировании. Эти делегаты обычно пишут наследуя от QStyledItemDelegate. Это большая тема. Я не смогу описать здесь все тонкости за раз.

Очень много работал со всеми этими моделями и делегатами для таблиц и немного для форм. И хотел бы даже написать об этом.
В целом, работает 50\50. Надо «плясать с бубном». Этим пляскам и была посвящена часть про «QDataMapper».
Уменьшил размеры иллюстраций. Читайте.
Иногда можно потратить часы на исследование чужого кода. Там всякое можно увидеть. А вы не захотели даже понять описанное решение среди плохих иллюстраций. Наверное не очень то и хотелось.

У вас просто не хватит терпения на код… Можете смело закрыть статью и забыть.
Спасибо что заметили про размеры. Иллюстрации переделал.
Каждому полю на форме нужно вручную добавлять свойство с заданным именем?

Да. Это логично, что поля ввода на форме, как то линкуются со столбцами в базе. У меня это property QObject -a.
Котика можно пропустить. Извиняйте что не влезает. Просто первая статья, и тренируюсь на котиках.
Котики плохую статью не спасут.
Котик(он тут один) никого не спасает. Насчёт «плохой статьи», обоснуйте.
12 ...
10

Информация

В рейтинге
Не участвует
Откуда
Россия
Зарегистрирован
Активность