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)
To copy to clipboard, switch view to plain text mode
and
mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit)
To copy to clipboard, switch view to plain text mode
) 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
) : ui(new Ui::Problem)
{
ui->setupUi(this);
createDatabase();
model->setTable("someTable");
model->select();
ui->tableView->setModel(model);
mapper->setModel(model);
mapper->addMapping(ui->someLineEdit, model->fieldIndex("some"));
mapper->addMapping(ui->thingLineEdit, model->fieldIndex("thing"));
ui->tableView->setCurrentIndex(model->index(0, 0));
}
Problem::~Problem()
{
delete ui;
}
void Problem::createDatabase(){
db.setDatabaseName(":memory:");
if (!db.open()){
"Error: " + db.lastError().text());
}
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();
}
}
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);
}
#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);
}
To copy to clipboard, switch view to plain text mode
I've tried many solutions on my own already, but none of them worked.
Bookmarks