Прошу не судить строго за возможно элементарную ошибку -
Данные из базы выводятся в виджеты (через модель и мэппер) корректно, редактируются, но изменения не фиксируются (при переходе к следующей записи и возврате к первой - изменения пропадают)
Собственно код(переделываю стандартный пример):
Раскрывающийся текст
#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);
}
#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);
}
Заранее благодарю за ответы!