Hi,
I try to edit a sqlite database with a form. I followed this post : Mapping Data to Widgets [doc.qt.digia.com].
The QCombobox is correctly populated with the “nom” field from “familles” table as follow :
m_relModel = new QSqlRelationalTableModel(this,db);
m_relModel->setTable("clients");
m_relModel->setRelation(9,QSqlRelation("familles","id","nom"));
m_famillesModel = m_relModel->relationModel(9);
m_relModel->select();
ui->familleComboBox->setModel(m_famillesModel);
ui->familleComboBox->setModelColumn(m_famillesModel->fieldIndex("nom"));
The problem is the QCombobox mapping.
My QCombobox is editable and the right text is shown, but the wrong item is selected.
I mean “Item 3” is written in the editable combobox for instance, but when I open the combobox popup, “Item 0” is selected. If I open a second time the popup, “Item 3” is selected.
If I call QDataWidgetMapper::submit() without opening the QCombobox popup, the first item is submitted, and the data change in the database even if nothing changed in the form. (That’s the problem here)
If I’ve open two times the QCombobox popup (without selecting item) before submitting, the selected item (i.e the database model’s item) is submitted, so it’s OK.
And if I select another item, the selected item is submitted, it’s OK too.
I don’t want to be forced to select the correct item again each time…
I don’t know if this is a bug, or if I do do things wrong.
If someone could help me, it would be great.
Here is my code :
if(!DatabaseManager::instance()->isConnected())
DatabaseManager::instance()->connect();
QSqlDatabase db = DatabaseManager::instance()->getDatabase();
m_clientsModel = new QSqlTableModel(this,db);
m_clientsModel->setTable("clients");
m_clientsModel->select();
m_relModel = new QSqlRelationalTableModel(this,db);
m_relModel->setTable("clients");
m_relModel->setRelation(9,QSqlRelation("familles","id","nom"));
m_famillesModel = m_relModel->relationModel(9);
m_relModel->select();
ui->familleComboBox->setModel(m_famillesModel);
ui->familleComboBox->setModelColumn(m_famillesModel->fieldIndex("nom"));
m_fidelitesModel = new QSqlQueryModel;
QSqlQuery query;
query.prepare("select f.id as id_fidelite, c.nom || \" \" || c.prenom as nom from clients as c join fidelites as f on c.id_fidelite=f.id where c.id_famille = :id_famille");
int famille_index = ui->familleComboBox->currentIndex();
QVariant id_famille = m_famillesModel->data(m_famillesModel->index(famille_index,0));
qDebug() << id_famille;
query.bindValue(":id_famille",id_famille.toInt());
query.exec();
qDebug() << query.lastError(); // QSqlError(-1, "", "")
m_fidelitesModel->setQuery(query);
ui->fideliteComboBox->setModel(m_fidelitesModel);
ui->fideliteComboBox->setModelColumn(1);
m_mapper = new QDataWidgetMapper(this);
m_mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
m_mapper->setModel(m_relModel);
m_mapper->setItemDelegate(new QSqlRelationalDelegate(this));
m_mapper->addMapping(...)
...
m_mapper->addMapping(ui->familleComboBox,9);
...
m_mapper->setCurrentIndex(2);
for submitting :
void MyClass::on_pushButton_pressed()
{
qDebug() << m_mapper->submit(); // return false even if data are submitted to the database... (?)
}
Thanks
↧