Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
SELECT -1 as id, '(Select country)' as countryname UNION SELECT id, countryname FROM country
Добавление пустых строчек-заменителей делается всё на стандартных моделях без зауми. QSqlQueryModel
В чём магия создания моделей именно для QComboBox — не раскрыто.
Как вставлять отличные от QListView отображения в QComboBox и пользовать их — не сказано.
То как быть в случае когда второй столбец будет иметь какой то другой тип данных?Писать модель или кастовать их в общий тип на стороне БД. А у вас часто так бывает, что типы в столбце не совпадают?
В том то и дело что тут нет никакой магии.Я с вами не согласен. Есть некоторые фишки, которые есть только у QComboBox, и которые можно интересно использовать: смена отображения, редактирование с валидатором, манипуляции над моделью аля мультивыбор. Но вы о них ни слова не сказали, как будто даже доки не открывали.
Я обещал заполнять контентом комбобоксы одной строчкой кода. И показал.Вы целую модель под это написали. А всего-то надо было запихнуть union в запрос и modelColumn(1) в комбобокс, да IDшник брать по comboBox->model()->index(index.row(),0).data().toInt().
Решается это такЧто решается? Это уже решено, скрин по ссылке. Стоило хотя бы просто указать, что вместе с моделью можно менять и отображение.
Писать модель или кастовать их в общий тип на стороне БД. А у вас часто так бывает, что типы в столбце не совпадают?
Я с вами не согласен. Есть некоторые фишки, которые есть только у QComboBox, и которые можно интересно использовать: смена отображения, редактирование с валидатором, манипуляции над моделью аля мультивыбор. Но вы о них ни слова не сказали, как будто даже доки не открывали.
Вы целую модель под это написали.
А всего-то надо было запихнуть union в запрос и modelColumn(1) в комбобокс, да IDшник брать по comboBox->model()->index(index.row(),0).data().toInt().
Что решается? Это уже решено, скрин по ссылке.
Стоило хотя бы просто указать, что вместе с моделью можно менять и отображение.Напишите свою статью о комбобоксах. Я за вас только порадуюсь.
comboBox1 = new BaseKeyComboBox();
comboBox1->setModel(sourceModel); //модель примерно такая "SELECT RecordID, DisplayText FROM MyCatalog;"
comboBox1->setModelColumn(1); // Колонка для отображения текста
comboBox1->setKeyColumn(0); // Колонка для ключа ID ТОЛЬКО int!!!!!!!
comboBox1->setEditable(false);
// mapper - это QDataWidgetMapper
// Подключается как обычно
mapper->addMapping(comboBox1, mainModel->fieldIndex("referemceid"));
Причем я не понял зачем делать модель специально для этого случая.
И я не увидел, он у вас с QDataWidgetMapper умеет работать?
Вот вы заполняете комбобокс пятью строчками кода плюс незнаю что там в модели. А я это делаю одной строкой. Когда комбобоксов от 10-и в программе. Есть над чем задуматься.
Я могу заполнять и одной строчкой кода, если все остальное используется по умолчанию. А модель самая обычная, самое главное чтобы там были столбцы типа int для ключа БД и QString для отображения.
А если таких виджетов много, то можно и фабрику под это дело использовать. Это уже вопрос уровня абстракций.
QDataWidgetMapper и должен работать с тем, что показывается пользователю. Никто же не делает несколько пунктов с одинаковым содержимым 'Пункт1, Пункт1', или я смысл не уловил…
То без изменения QSqlQueryModel, в качестве модели комбобокса, выдаст просто список «id». А человекочитаемое значение не будет видно
Q_PROPERTY(int currentKey READ currentKey WRITE setCurrentKey NOTIFY currentKeyChanged USER true)
mapper->addMapping(comboBox1, mainModel->fieldIndex("referemceid"));
И я подумал что очередные пляски с бубном как с QSqlTableModel мне не нужны.
QSqlTableModel может сохранять данные в базу. Странно что на форме раздельное сохранение данных для таблицы и простых полей. QSqlTableModel иногда работает с ошибками. Потом, у него немного ограниченный функционал. Поэтому вы можете плюнуть и воспользоваться QSqlQueryModel. Который уже ничего не сохраняет, но и ограничений у него нет. В этом случае таблица будет только для чтения.?
contentModel = new EditSqlQueryModel(db, this);
contentModel->setEditStrategy(EditSqlQueryModel::OnManualSubmit);
contentModel->showDeleted(false);
contentModel->setQuery("SELECT "
"a.recordid, "
"a.productionid, "
"a.productionclassid, "
"d.name as productionclassname, "
"FROM foamcontourproductioncontent a "
"left join productionclass as d on a.productionclassid = d.recordid "
"where a.foamcontourproductionid = " + QString::number(m_recordId) + " "
"order by a.recordid;");
contentModel->setTable("foam.productioncontent");
contentModel->init();
EditSqlQueryModel::FieldMap fMap;
QSqlRecord rec;
rec = contentModel->record();
fMap.insert("recordid", rec.field("recordid"));
fMap.insert("productionid", rec.field("productionid"));
contentModel->setUpdatableFields(fMap);
Создание моделей данных для QComboBox