QDataWidgetMapper QCombobox wrong item selected



  • Hi,

    I try to edit a sqlite database with a form. I followed this post : "Mapping Data to Widgets":http://doc.qt.digia.com/qq/qq21-datawidgetmapper.

    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&#40;&#41;;
    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



  • OK, when I select my item manually, it works :
    @int id_famille = m_clientsModel->data(m_clientsModel->index(2,9)).toInt(); ui->familleComboBox->setCurrentIndex(getIndexFromFamilleId(id_famille));@
    with :
    @int ClientEditView::getIndexFromFamilleId(int id_famille)
    {
    int nbRows = m_famillesModel->rowCount();
    for(int i=0;i<nbRows;i++)
    {
    int temp = m_famillesModel->record(i).value(0).toInt();
    if(temp == id_famille)
    return i;
    }
    return -1;
    }@

    I think it's a bit tedious, but I haven't found other solution.
    However, @m_mapper->submit();@ always return false, somebody know why ?


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.