From 28b2375e42fd5cff36557bb33daf30b6d03ef4df Mon Sep 17 00:00:00 2001 From: giomba Date: Fri, 16 Aug 2019 18:38:30 +0200 Subject: [PATCH] [argento] ui<->database properly connected using QtModel --- argento/EditWindow.cpp | 110 ++++++++++++++++++++--------------------- argento/EditWindow.h | 3 ++ 2 files changed, 56 insertions(+), 57 deletions(-) diff --git a/argento/EditWindow.cpp b/argento/EditWindow.cpp index a1ba2d5..cf562e3 100644 --- a/argento/EditWindow.cpp +++ b/argento/EditWindow.cpp @@ -3,75 +3,70 @@ EditWindow::EditWindow(int idSocio, QWidget* parent) : QMainWindow(parent), ui(new Ui::EditWindow) { ui->setupUi(this); - /* connect query with common database */ + /* connect query with common global database */ query = QSqlQuery(db); - /* retrieve professione and fonte from database */ - query.prepare("SELECT id, professione FROM professione ORDER BY professione"); - query.exec(); - while (query.next()) { - ui->comboProfessione->addItem(query.value(1).toString(), query.value(0).toInt()); - } + model = new QSqlRelationalTableModel(this); + model->setTable("socio"); + model->setFilter(QString("socio.id = %1").arg(idSocio)); + model->setEditStrategy(QSqlTableModel::OnManualSubmit); - query.prepare("SELECT id, fonte FROM fonte ORDER BY fonte"); - query.exec(); - while (query.next()) { - ui->comboFonte->addItem(query.value(1).toString(), query.value(0).toInt()); - } + int professioneIdx = model->fieldIndex("professione"); + int fonteIdx = model->fieldIndex("fonte"); - /* populate fields from database */ - query.prepare("SELECT s.id, s.nome, s.cognome, \ - s.dataNascita, s.comuneResidenza, s.email, s.professione, s.fonte, s.abilitaQuestionario, \ - q.dataCompilazione \ - FROM socio AS s LEFT OUTER JOIN questionario AS q ON s.id = q.socio \ - WHERE s.id = :id"); - query.bindValue( ":id", idSocio ); - query.exec(); - query.first(); + model->setJoinMode(QSqlRelationalTableModel::LeftJoin); - /* show everything in the interface */ - ui->lineID->setText(query.value( query.record().indexOf("id") ).toString()); - ui->lineNome->setText(query.value( query.record().indexOf("nome") ).toString()); - ui->lineCognome->setText(query.value( query.record().indexOf("cognome") ).toString()); - ui->lineComuneResidenza->setText(query.value(query.record().indexOf("comuneResidenza")).toString()); - ui->lineEmail->setText(query.value(query.record().indexOf("email")).toString()); - ui->comboProfessione->setCurrentIndex(ui->comboProfessione->findData(query.value(query.record().indexOf("professione")).toInt())); - ui->comboFonte->setCurrentIndex(ui->comboFonte->findData(query.value(query.record().indexOf("fonte")).toInt())); - ui->dateDataNascita->setDate(QDate(1900, 1, 1)); ui->dateDataNascita->setDate(query.value(query.record().indexOf("dataNascita")).toDate()); - ui->dateDataCompilazione->setDate(QDate(1900, 1, 1)); ui->dateDataCompilazione->setDate(query.value(query.record().indexOf("dataCompilazione")).toDate()); - ui->checkAbilitaQuestionario->setChecked( query.value(query.record().indexOf("abilitaQuestionario")).toBool() ); -} + model->setRelation(professioneIdx, QSqlRelation("professione", "id", "professione")); + model->setRelation(fonteIdx, QSqlRelation("fonte", "id", "fonte")); -void EditWindow::on_buttonSalva_clicked() { - - query.prepare("UPDATE socio \ -SET nome = NULLIF(:nome, ''), \ -cognome = NULLIF(:cognome, ''), \ -dataNascita = NULLIF(:dataNascita, '1900-01-01'), \ -comuneResidenza = NULLIF(:comuneResidenza, ''), \ -email = NULLIF(:email, ''), \ -professione = NULLIF(:professione, 0), \ -fonte = NULLIF(:fonte, 0), \ -abilitaQuestionario = :abilitaQuestionario \ -WHERE id = :id"); - query.bindValue(":id", ui->lineID->text()); - query.bindValue(":nome", ui->lineNome->text()); - query.bindValue(":cognome", ui->lineCognome->text()); - query.bindValue(":comuneResidenza", ui->lineComuneResidenza->text()); - query.bindValue(":email", ui->lineEmail->text()); - query.bindValue(":dataNascita", (ui->dateDataNascita->date()).toString("yyyy-MM-dd")); - query.bindValue(":professione", ui->comboProfessione->currentData().toInt()); - query.bindValue(":fonte", ui->comboFonte->currentData().toInt()); - query.bindValue(":abilitaQuestionario", ui->checkAbilitaQuestionario->isChecked()); - - if ( ! query.exec() ) { + if (! model->select()) { qDebug() << fullQuery(query); qDebug() << db.lastError().text(); Ui::status(Ui::ERROR, "query error"); return; } - Ui::status(Ui::SUCCESS, "successfull update"); + QSqlTableModel* professioneModel = model->relationModel(professioneIdx); + ui->comboProfessione->setModel(professioneModel); + ui->comboProfessione->setModelColumn(professioneModel->fieldIndex("professione")); + + QSqlTableModel* fonteModel = model->relationModel(fonteIdx); + ui->comboFonte->setModel(fonteModel); + ui->comboFonte->setModelColumn(fonteModel->fieldIndex("fonte")); + + QDataWidgetMapper* mapper = new QDataWidgetMapper(this); + mapper->setModel(model); + mapper->setItemDelegate(new QSqlRelationalDelegate(this)); + mapper->addMapping(ui->lineID, model->fieldIndex("id")); + mapper->addMapping(ui->lineCognome, model->fieldIndex("cognome")); + mapper->addMapping(ui->lineNome, model->fieldIndex("nome")); + mapper->addMapping(ui->dateDataNascita, model->fieldIndex("dataNascita")); + mapper->addMapping(ui->lineComuneResidenza, model->fieldIndex("comuneResidenza")); + mapper->addMapping(ui->lineEmail, model->fieldIndex("email")); + mapper->addMapping(ui->comboProfessione, professioneIdx); + mapper->addMapping(ui->comboFonte, fonteIdx); + + mapper->toFirst(); + +} + +void EditWindow::on_buttonSalva_clicked() { + + if (model->isDirty()) { + model->database().transaction(); + + if (model->submitAll()) { + model->database().commit(); + Ui::status(Ui::SUCCESS, "successfull update"); + } else { + model->database().rollback(); + qDebug() << model->lastError(); + Ui::status(Ui::ERROR, "model transaction submit error"); + } + } else { + Ui::status(Ui::INFO, "nothing done"); + } + } void EditWindow::on_buttonAnnulla_clicked() { @@ -80,5 +75,6 @@ void EditWindow::on_buttonAnnulla_clicked() { EditWindow::~EditWindow() { + delete model; delete ui; } diff --git a/argento/EditWindow.h b/argento/EditWindow.h index 85361de..ba7de7d 100644 --- a/argento/EditWindow.h +++ b/argento/EditWindow.h @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include @@ -30,6 +32,7 @@ private slots: private: QSqlQuery query; + QSqlRelationalTableModel* model = nullptr; Ui::EditWindow *ui; };