Я могу заполнять и одной строчкой кода, если все остальное используется по умолчанию. А модель самая обычная, самое главное чтобы там были столбцы типа 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».
Иногда можно потратить часы на исследование чужого кода. Там всякое можно увидеть. А вы не захотели даже понять описанное решение среди плохих иллюстраций. Наверное не очень то и хотелось.
У вас просто не хватит терпения на код… Можете смело закрыть статью и забыть.
Насколько я понимаю вы сделали свою реализацию QComboBox — BaseKeyComboBox. Он использует простую модель типа QSqlQueryModel. Я использую простой QComboBox. Но сделал для него особенную модель из QSqlQueryModel.
В обоих случаях нам надо добавлять в проект два лишних файла. С примерно одинаковым количеством кода. И в обоих случаях это даёт заполнение QComboBox данными одной строчкой кода.
Теперь о том чего нельзя сделать в вашем варианте. Если посмотреть шире то модель она не только для данных. Через наследника модели можно определить всплывающую подсказку(tooltip), шрифт пункта и ещё много чего перечисленного в enum ItemDataRole (qnamespace.h).
В частности, хотел в своё время запрашивать из базы три столбца вместо двух. Что бы третий выводился как ToolTipRole первого столбца модели. Именно поэтому у меня название параметра columns в BaseComboModel.
Может я не так объяснил. Попробую по другому.
Вот вы заполняете комбобокс пятью строчками кода плюс незнаю что там в модели. А я это делаю одной строкой. Когда комбобоксов от 10-и в программе. Есть над чем задуматься.
Нет. Дело в том что мой комбобокс обязан устанавливать значения по вторичному ключу БД из Qt::UserRole. А QDataWidgetMapper работает со строкой из Qt::DisplayRole. К тому же этот маппер работает через раз.
Если у вас есть пара часов свободного времени. Можете ознакомиться как этот комбобокс сохраняет и заполняет значения из БД — https://habrahabr.ru/post/328670/
Грубо говоря я написал свою замену QDataWidgetMapper
Пустые строчки можно делать и SQL запросом, согласен. Хотя если брать ваш UNION. То как быть в случае когда второй столбец будет иметь какой то другой тип данных? Переписать запрос?! В том то и дело что модели всё равно на конфликт типов данных с SQL запросом.
В том то и дело что тут нет никакой магии. Всё проще простого. Смотрите код. Причём модель для таблицы можно подать в комбобокс и наоборот.
А я обещал осветить именно эту тему?! Я обещал заполнять контентом комбобоксы одной строчкой кода. И показал.
Решается это так: QTableView c указанной QSqlQueryModel. Но там надо назначить делегаты которые будут отображать комбобоксы при редактировании. Эти делегаты обычно пишут наследуя от QStyledItemDelegate. Это большая тема. Я не смогу описать здесь все тонкости за раз.
В целом, работает 50\50. Надо «плясать с бубном». Этим пляскам и была посвящена часть про «QDataMapper».
У вас просто не хватит терпения на код… Можете смело закрыть статью и забыть.
Да. Это логично, что поля ввода на форме, как то линкуются со столбцами в базе. У меня это property QObject -a.
Котик(он тут один) никого не спасает. Насчёт «плохой статьи», обоснуйте.