Не обновляется модель QsqlRelationTableModel, Изменение данных не сохраняется в модель; |
Здравствуйте, гость ( Вход | Регистрация )
Не обновляется модель QsqlRelationTableModel, Изменение данных не сохраняется в модель; |
Гость_Mir_* |
23.7.2015, 16:18
Сообщение
#1
|
Гости |
Добрый день!
Прошу не судить строго за возможно элементарную ошибку - Данные из базы выводятся в виджеты (через модель и мэппер) корректно, редактируются, но изменения не фиксируются (при переходе к следующей записи и возврате к первой - изменения пропадают) Собственно код(переделываю стандартный пример): Раскрывающийся текст #include <QtWidgets> #include <QtSql> #include <QSqlDatabase> #include "window.h" #include <QDebug> #include <QSqlError> //! [Set up widgets] Window::Window(QWidget *parent) : QWidget(parent) { setupModel(); nameLabel = new QLabel(tr("Sensor Name:")); nameEdit = new QLineEdit(); topLabel = new QLabel(tr("Top lvl:")); topEdit = new QLineEdit(); nextButton = new QPushButton(tr("&Next")); previousButton = new QPushButton(tr("&Previous")); mapper = new QDataWidgetMapper(this); mapper->setModel(SensorsMod); mapper->addMapping(nameEdit, SensorsMod->fieldIndex("name")); mapper->addMapping(topEdit, SensorsMod->fieldIndex("top")); connect(previousButton, SIGNAL(clicked()), mapper, SLOT(toPrevious())); connect(nextButton, SIGNAL(clicked()), mapper, SLOT(toNext())); connect(mapper, SIGNAL(currentIndexChanged(int)), this, SLOT(updateButtons(int))); QGridLayout *layout = new QGridLayout(); layout->addWidget(nameLabel, 0, 0, 1, 1); layout->addWidget(nameEdit, 0, 1, 1, 1); layout->addWidget(previousButton, 0, 2, 1, 1); layout->addWidget(topLabel, 1, 0, 1, 1); layout->addWidget(topEdit, 1, 1, 2, 1); layout->addWidget(nextButton, 1, 2, 1, 1); setLayout(layout); mapper->toFirst(); } void Window::setupModel() { db = QSqlDatabase::addDatabase("QPSQL", "AstroDB"); db.setHostName("localhost"); db.setDatabaseName("AstroDB"); db.setUserName("postgres"); db.setPassword("admin"); if (!db.open()) { QMessageBox::critical(0, tr("Cannot open database"), tr("Unable to establish a database connection.\n" ), QMessageBox::Cancel); return; } SensorsMod = new QSqlRelationalTableModel(this,db); SensorsMod->setTable("sensors"); SensorsMod->setEditStrategy(QSqlTableModel::OnFieldChange); SensorsMod->select(); } void Window::updateButtons(int row) { previousButton->setEnabled(row > 0); nextButton->setEnabled(row < SensorsMod->rowCount() - 1); } Заранее благодарю за ответы! |
|
|
Mira |
27.7.2015, 17:35
Сообщение
#2
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 27.7.2015 Пользователь №: 4422 Спасибо сказали: 0 раз(а) Репутация: 0 |
Проблема сдвинулась с мертвой точки, выяснилось что модель не пишется в базу данных потому что
при выполнении UPDATE WHERE idSensors= Он не может найти это поле. Конечно не может - поле уже давно переименовано, и в проге не упоминается вообще, откуда он выдергивает это старое название - загадка? (пересборка и чистка сборочного каталога не возымели эффекта) Откуда он берет эти названия полей для модели? |
|
|
Mira |
27.7.2015, 18:16
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 27.7.2015 Пользователь №: 4422 Спасибо сказали: 0 раз(а) Репутация: 0 |
Проблема решилась: оказалось postgress хранит неведомо где старые названия полей, которые и выдает в модель. Сделала резервную копию базы, удалила ее нафиг и создала новую из резервной копии. Теперь названия полей в модель отдаются корректные.
|
|
|
Текстовая версия | Сейчас: 28.11.2024, 1:31 |