PDA

View Full Version : QSqlTableModel + QDataWidgetMapper - actual row changes into -1 after submit



probablyMe
17th October 2010, 12:53
Hi.

I'm starting with Qt and have a problem - I want to create a form (created using QDataWidgetMapper) to edit records in SQLite database (listed in TableView), but every time changes are subbmited (I want them to be subbmited immediately after change, so I've set
model->setEditStrategy(QSqlTableModel::OnFieldChange) and
mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit)) the acutal row changes into -1, last selected row is no longer selected and I must once again select it to continiue editing.

How to prevent changing row to -1 after submit? or maybe any other solutions to make this editing easy, logic and working?
I've read somwhere that's it's not bug, it's a feature but it makes my app useless.

piece of my code (created using books example):
(whole project zipped in attachements if somebody wants to experiment with it)

#include "problem.h"
#include "ui_problem.h"

#include <QtSql>

Problem::Problem(QWidget *parent) :
QWidget(parent),
ui(new Ui::Problem)
{
ui->setupUi(this);
createDatabase();

model = new QSqlTableModel(ui->tableView);
model->setEditStrategy(QSqlTableModel::OnFieldChange);
model->setTable("someTable");

model->select();

ui->tableView->setModel(model);

mapper = new QDataWidgetMapper(this);
mapper->setModel(model);
mapper->addMapping(ui->someLineEdit, model->fieldIndex("some"));
mapper->addMapping(ui->thingLineEdit, model->fieldIndex("thing"));
mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);

connect(ui->tableView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex, QModelIndex)),
this, SLOT(rowChange(QModelIndex, QModelIndex)));

ui->tableView->setCurrentIndex(model->index(0, 0));
}

Problem::~Problem()
{
delete ui;
}

void Problem::createDatabase(){
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()){
QMessageBox::critical(this, "Error occured",
"Error: " + db.lastError().text());
}

QSqlQuery q;
q.exec("create table someTable(some varchar, thing varchar)");

q.prepare(QString("insert into someTable(some, thing) values(?, ?)"));
for(int i = 0; i < 6; ++i){
q.addBindValue(QString("some %1").arg(i));
q.addBindValue(QString("thing %1").arg(6 - i));
q.exec();
}
}

void Problem::rowChange(QModelIndex actual, QModelIndex last) {
qDebug() << "row change - from" << last.row() << " to " << actual.row();
if(actual.row() == -1)
qDebug() << "wanted row: " << last.row();
else
qDebug() << "wanted row: " << actual.row();
mapper->setCurrentModelIndex(actual);
}


I've tried many solutions on my own already, but none of them worked.