crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Не обновляется модель 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);

}


Заранее благодарю за ответы!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 2)
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 хранит неведомо где старые названия полей, которые и выдает в модель. Сделала резервную копию базы, удалила ее нафиг и создала новую из резервной копии. Теперь названия полей в модель отдаются корректные.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.12.2024, 8:29