Мужики, имею вопрос!
Есть таблица
courses в базе с такой структурой:
Так же, есть таблица
custommers с такой структурой:
id_custmmers | nameООО Рога и Капыта | ООО Шарашкина Контора |
| id_course |
Таблицу
custommers я сократил конечно же, так как остальные колонки не относятся к делу.
Задача состоит в следующем: мне необходимо редактировать таблицу
custommers, и делать это необходимо при помощи
QSqlTableModel,
QComboBox и конечно же
QDataWidgetMapper. Я не думал, что у меня возникнут какие либо сложности. Задача показалась, мне до боли простой. Я в начале создал
QComboBox получил данные из БД при помощи
QSqlTableModel и задал
QComboBox полученную модель, предварительно убедившись, что модель получает данные! Вот код:
QSqlTableModel *boxCourseModel = new QSqlTableModel;
boxCourseModel->setTable("courses");
boxCourseModel->select();
boxCourse->setModel(boxCourseModel)
После вывода окна диалога, в котором находится сей
QComboBox, я получил список, в котором отображаются элементы из колонки
id_course из таблицы
courses. Видимо, это потому, что
QComboBox при добовлении нового элемента, запрашивает в начале имя элемента (то, что будет отображаться в выпадающем меню
QComboBox), а потом уже просит ключ этого поля. Запрашивая данные из БД, при помощи QSqlTableModel я получаю струткру данных иную key=>value что и наглядно видно на выходе.
Я не остановился на этом и добавил новый параметр
QComboBox : boxCourse->setModelColumn(1);
Теперь, код определения QComboBox выглядит так:
QSqlTableModel *boxCourseModel = new QSqlTableModel;
boxCourseModel->setTable("courses");
boxCourseModel->select();
boxCourse->setModel(boxCourseModel);
boxCourse->setModelColumn(1);
Я решил, что этим параметром, я указал какую колонку отображать в списке QComboBox, а другая колонка, мол будет ее идентификатором. Однако, оказалось это не так. Я так, понял, что при указании setModelColumn, как бы в QComboBox попадает, список, только этого набора данных, то есть попадает только поле name списком, а идентификаторы присваиваются автоматически самим QComboBox начиная с 0. Я радовался, когда все работало и отображалось, как нужно, но беда в том, что при использовании
QDataWidgetMapper начали возникать трудности.
QSqlTableModel *tempModel = new QSqlTableModel;
tempModel->setTable("custommers");
tempModel->setFilter("name = '"+string+"'");
tempModel->select();
QDataWidgetMapper *map = new QDataWidgetMapper;
map->setModel(tempModel);
map->addMapping(boxCourse, 4, "currentIndex");
map->addMapping(boxTeams, 3, "currentIndex");
map->toFirst();
Что я получаю? Получается, к примеру, что из таблицы (смотри выше)
custommers я получаю данные, по полю name с именем "ООО Рога и Копыта" тем, самым получая из поля
id_course я получаю цифру 1 и mapper пытается связать ее с моим
QComboBox, в котором идентификатор 1, это уже не та еденица, которая в таблице
id_courses, в поле
id_course, исходя из идентификаторов самого
QComboBox, отсчет которых начинается с нуля, это получается второй элемент, а второй элемент в моей таблице это совсем другой элемент! Вот и получается, что ничерта не получается!
Я для эксперимента изменил структуру таблицы courses поменяв местами столбики name и
id_course, так работает все правильно, в новой структуре моя таблица выглядит вот так:
В этом случае, все работает. Однако, я не могу оставлять так таблицу, потому что изначально, не имея опыта, спроэктировал работу с базой данных не правильно, и с этой таблицей имеют связь другие части приложения, по явному указанию номера колонки, есть ли какие либо варианты выхода из этого положения?