Arrow24 июня 2018 г. 9:10
QComboBox и База данных
Добрый день.
Необходима помощь в работе с QComboBox в связке с базой данных.
Описание:
Есть две таблицы:
1) "extension" с полями: id, library, function, ext.
2) "ext_type" с полями: id, type.
Таблицы связаны по полям ext и type. В первую таблицу в поле ext записывается id из второй таблицы.
В главном окне расположена таблица в которой отображаются данные из таблицы extension, в поле ext подставляется вместо id соответствующий type из таблицы "ext_type".
Код:
mainModel = new QSqlRelationalTableModel(this); mainModel->setTable("extension"); mainModel->setSort(0, Qt::AscendingOrder); ui->mainTableView->setModel(mainModel); // Выбор extension с таблицы ext_type по id mainModel->setRelation(3, QSqlRelation("ext_type", "id", "type")); ui->mainTableView->setItemDelegate(new QSqlRelationalDelegate(ui->mainTableView)); mainModel->select(); ui->mainTableView->setColumnHidden(0, true); for (int i = 0; i < ui->mainTableView->horizontalHeader()->count(); i++) { ui->mainTableView->horizontalHeader()->setSectionResizeMode(i, QHeaderView::Stretch); }Все подставляется хорошо.
Второе окно открывается при редактировании записи в таблице или создании новой. На нем расположены QLineEdit для полей library, function и QComboBox для поля extension.
Нужно чтобы при создании новой записи из QComboBox пользователь мог выбрать значения из поля type таблицы ext_type.
Сделал так (под выбор работает а при редактировании существующей записи в QComboBox появляется не та строка):
ОШИБКА ЗДЕСЬ:
model = new QSqlTableModel(this); mapper = new QDataWidgetMapper(); mapper->setModel(model); mapper->addMapping(ui->Line1, 1); mapper->addMapping(ui->Line2, 2); QSqlQueryModel *select = new QSqlQueryModel(this); select->setQuery("select type from ext_type"); ui->comboBox->setModel(select); mapper->addMapping(ui->comboBox, model->fieldIndex("extension"), "currentIndex"); mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit); mapper->toLast();Сохранение так (сохраняет, но из comboBox в таблицу попадает не та запись (см. выше)):
mapper->submit();Помогите решить проблему.
model->submitAll();
model->select();
mapper->toLast();
И почему-то
mainModel->setRelation(3, QSqlRelation("ext_type", "id", "type"));с таблицами выше работает.
А в этом случае нет:
mainModel = new QSqlRelationalTableModel(this);В таблицу на форме вообще не выводятся данные (в сама таблица в базе данных заполнена).
mainModel->setTable("security_question");
mainModel->setSort(0, Qt::AscendingOrder);
ui->mainTableView->setModel(mainModel);
// Здесь
mainModel->setRelation(1, QSqlRelation("question", "id", "type"));
ui->mainTableView->setItemDelegate(new QSqlRelationalDelegate(ui->mainTableView));
mainModel->select();
ui->mainTableView->setColumnHidden(0, true);
for (int i = 0; i < ui->mainTableView->horizontalHeader()->count(); i++) {
ui->mainTableView->horizontalHeader()->setSectionResizeMode(i, QHeaderView::Stretch);
}
Структура таблиц:
1) Таблица security_question: id, SecurityQuestion, Answer.
2) Таблица question: id, type.
Что может быль не так?
И подскажите как возможно организовать в базе данных запись в поле таблицы типа result1 или result2 в зависимости от того, какой QRadioButton пользователь выбрал на форме. А также, чтобы при редактировании данных на форме включался нужный QRadioButton в зависимости от записи?
В этом случае пока ничего не придумал.
Заранее спасибо за ответ и извините за долгое и возможно немного не понятное описание вопроса.
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
B
- Bogdannn
- 28 марта 2024 г. 2:15
C++ - Тест 001. Первая программа и типы данных
- Результат:46баллов,
- Очки рейтинга-6
Последние комментарии
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5 февраля 2024 г. 9:50
EVA25 декабря 2023 г. 18:30
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
Alexandru Codreanu19 января 2024 г. 19:57
BlinCT27 декабря 2023 г. 16:57
Дмитрий10 января 2024 г. 12:18
Evgenii Legotckoi12 декабря 2023 г. 14:48
Насчет этого:
Извините вопрос снят, ошибся. В базе данных на поле SecurityQuestion вместо integer поставил тип text.
Вообще должно работать, но там немного нюансы есть, к сожалению уже и не помню какие.
Подскажите как организовать в базе данных запись в поле таблицы типа result1 или result2 в зависимости от того, какой QRadioButton пользователь выбрал на форме. А также, чтобы при редактировании данных на форме включался нужный QRadioButton в зависимости от записи?
Имя поля таблицы "Group name" меня смущает пробел. в нем. Просто никогда не использовал и не видел пробелы в именах полей БД.
Добрый день!
Спасибо за ответ, но там было найдено решение, там одинаковые именя столбцов были в одном месте.
Большое спасибо всем за помощь!
Из опыта: уменьшить время отладки на больших запросах я формирую строку с запросом которую можно скормить клиенту БД и проверяю запрос там. а потом уже использую в коде.
Для больших запросов очень полезно.
Спасибо. У меня в таблице всего 4 столбца, но на будущее возьму на вооружение :)
Такой вопрос. Никто случайно не писал свой класс для QComboBox для работы сполями бызы данных, а то через мапер выходит много однотипного кода. Хочется сократить.
Сейчас делаю так:
Если код не имеет зависимости на какие-то внешние настройки, то можно просто наследоваться и настроить всё однотипное в конструкторе, если есть какие-то внешние параметры, то добавить публичный метод для настройки.
Не очень понял задачу?
Понял, спасибо. Единственные зависимости - имена таблиц и полей.