Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не обновляется модель QsqlRelationTableModel
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
Mir
Добрый день!
Прошу не судить строго за возможно элементарную ошибку -
Данные из базы выводятся в виджеты (через модель и мэппер) корректно, редактируются, но изменения не фиксируются (при переходе к следующей записи и возврате к первой - изменения пропадают)
Собственно код(переделываю стандартный пример):
Раскрывающийся текст
#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
Проблема сдвинулась с мертвой точки, выяснилось что модель не пишется в базу данных потому что
при выполнении UPDATE WHERE idSensors=
Он не может найти это поле. Конечно не может - поле уже давно переименовано, и в проге не упоминается вообще, откуда он выдергивает это старое название - загадка?
(пересборка и чистка сборочного каталога не возымели эффекта)

Откуда он берет эти названия полей для модели?
Mira
Проблема решилась: оказалось postgress хранит неведомо где старые названия полей, которые и выдает в модель. Сделала резервную копию базы, удалила ее нафиг и создала новую из резервной копии. Теперь названия полей в модель отдаются корректные.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.