Разбираюсь с редактированием данных с использованием форм. Столкнулся с проблемой. Для демонстрации написал программу (исходники есть во вложении). Создается БД SqLite с 2-мя строками, программа осуществляет навигацию по ним. При редактировании изменения должны сохраняться.
Теперь в чем проблема. Если после редактирования нажать вперед, то переход на новую запись не осуществляется, нужно нажать вперед еще раз. Если после редактирования последней записи нажать вперед, то почему-то происходит переход на первую запись.
Что я делаю не так? Буду благодарен за помощь.
main.cpp
C++ (Qt)
#include <QtGui/QApplication>
#include <QtSql>
#include <QMessageBox>
#include "dialog.h"
bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.dat");
if (!db.open()) {
QMessageBox::warning(0, QObject::tr("Database Error"),
db.lastError().text());
return false;
}
return true;
}
void createFakeData()
{
QSqlQuery query;
query.exec("CREATE TABLE users ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR(40) NOT NULL)");
query.exec("INSERT INTO users (name) VALUES ('john')");
query.exec("INSERT INTO users (name) VALUES ('bill')");
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
bool existingData = QFile::exists("test.dat");
if (!createConnection())
return 1;
if (!existingData)
createFakeData();
Dialog w;
w.show();
return a.exec();
}
dialog.h
C++ (Qt)
#ifndef DIALOG_H
#define DIALOG_H
#include <QtGui/QDialog>
#include <QPushButton>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QSqlRelationalTableModel>
#include <QDataWidgetMapper>
#include <QLabel>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
private:
QLineEdit *lineEdit_name;
QPushButton *btn_next;
QPushButton *btn_prev;
QHBoxLayout *layout;
QSqlRelationalTableModel *model;
QDataWidgetMapper *mapper;
};
#endif // DIALOG_H
dialog.cpp
C++ (Qt)
#include "dialog.h"
#include <QPushButton>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QSqlRelationalTableModel>
#include <QDataWidgetMapper>
#include <QtSql>
#include <QLabel>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
lineEdit_name = new QLineEdit;
btn_next = new QPushButton(">");
btn_prev = new QPushButton("<");
layout = new QHBoxLayout;
layout->addWidget(btn_prev);
layout->addWidget(lineEdit_name);
layout->addWidget(btn_next);
setLayout(layout);
model = new QSqlRelationalTableModel(this);
model->setTable("users");
model->setEditStrategy(QSqlTableModel::OnFieldChange);
model->select();
mapper = new QDataWidgetMapper(this);
mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
mapper->setModel(model);
mapper->addMapping(lineEdit_name, 1);
mapper->toFirst();
QObject::connect(btn_next, SIGNAL(clicked()),
mapper, SLOT(toNext()));
QObject::connect(btn_prev, SIGNAL(clicked()),
mapper, SLOT(toPrevious()));
}
Dialog::~Dialog()
{
}