Qt World Summit: Submit your Presentation


QComboBox dopo selezione, non visualizza più il campo modificato nel modello MySQL



  • Salve a tutti,
    ho un modello (QSqlRelationalTabelModel) visualizzato in QTableView. Una colonna di tale modello è in relazione con un'altra tabella e visualizzata tramite addMapping anche nella QComboBox.
    forum_1.jpeg

    Ad ogni cambio di selezione in QTableView la combo risponde correttamente. Quando apro la tendina della combo e modifico l'impostazione del campo,
    forum_2.jpeg
    tale modifica viene visualizzata nella QTableView
    forum_3.jpeg
    ma da questo momento i poi, ogni volta che seleziono la riga in cui è avvenuta la modifica, la combo non visualizza più il dato corretto.
    forum_5.jpeg
    Tutte le altre righe in cui non sono avvenute modifiche funzionano correttamente.
    forum_4.jpeg
    Il codice per la modifica del campo è il seguente:

    void Miscele::on_cBxCellaPrel_currentIndexChanged(int index)
    {
        QSqlRecord record=modVistaPrel->record(index);  //vista a cui la combo è relazionata
        QSqlField field=record.field(record.indexOf("id_silos"));
        QModelIndex indkey;
        indkey=modFormule->index(mapFormule->currentIndex(),indRelSilPrel,QModelIndex());  //modello visualizzato nella tableview
        modFormule->setData(indkey,field.value().toInt(),Qt::EditRole);
    }
    

    Se salvo il dato direttamente nel database, il problema si risolve, ma lo eviterei per lasciare la possibilità di annullare le modifiche apportate.
    Esiste una soluzione a questo problema?

    Giovanni



  • Mancano un po' di pezzi, non ho idea di cosa siano le variabili:

    • modVistaPrel (posso intuire essere il QSqlRelationalTabelModel)
    • modFormule
    • mapFormule
    • indRelSilPrel

    Se salvo il dato direttamente nel database, il problema si risolve, ma lo eviterei per lasciare la possibilità di annullare le modifiche apportate.

    Quindi ivece di prendere il dato dal DB (field.value(), prendilo dal modello chamando data()



  • Ti specifico meglio:

    modFormule = new QSqlRelationalTableModel(this);   modello della tabella formule
    mapFormule = new QDataWidgetMapper(this);          mapper della tabella formule
    modVistaPrel = new QSqlTableModel(this);           modello della vista dove prendo i nomi da visualizzare nella combo
    

    questa la relazione fra il modello formule e la vista

    indRelSilPrel=modFormule->fieldIndex("id_silos_mix");
    modFormule->setRelation(indRelSilPrel,QSqlRelation("miscele_silo_prel","id_silos","nome"));
    QSqlTableModel *relModelPrel=modFormule->relationModel(indRelSilPrel);
    relModelPrel->setFilter("id_silos<>0");
    ui->cBxCellaPrel->setModel(relModelPrel);
    ui->cBxCellaPrel->setModelColumn(relModelPrel->fieldIndex("nome"));
    

    Quindi ivece di prendere il dato dal DB (field.value(), prendilo dal modello chamando data()

    Scusa, ma non ho capito cosa mi hai suggerito.

    Giovanni



  • @Badela said in QComboBox dopo selezione, non visualizza più il campo modificato nel modello MySQL:

    mapFormule = new QDataWidgetMapper(this); mapper della tabella formule

    Ok, capito.
    Puoi mostrare il pezzo di codice in cui chiami mapFormule->setCurrentIndex?



  • @VRonin said in QComboBox dopo selezione, non visualizza più il campo modificato nel modello MySQL:

    Puoi mostrare il pezzo di codice in cui chiami mapFormule->setCurrentIndex?

    qui imposto che il segnale emesso dalla QTableView delle formule (dove al click di una cella corrisponde la selezione della riga) aggancia lo SLOT che gestisce il cambio di riga:

    connect(TbVwFormula->selectionModel(),SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),this, SLOT(changeSelectionFormule(QModelIndex)));
    

    e questo è lo SLOT:

    void Miscele::changeSelectionFormule(const QModelIndex &index)
    {
        qDebug()<<"change table in";
        changeSelectionF=true;
        selezioneFormula=true;
        mapFormule->setCurrentModelIndex(index);
        changeSelectionF=false;
        qDebug()<<"change table out";
     }
    

    Giovanni



  • hmmm, cosa ritorna qDebug() << index.data();?



  • @VRonin said in QComboBox dopo selezione, non visualizza più il campo modificato nel modello MySQL:

    hmmm, cosa ritorna qDebug() << index.data();?

    Ritorna il valore corretto come effettivamente è presente nella tabella dopo la modifica tramite la combo.

    Se può esserti utile, ti giro tutto il codice della classe...

    Giovanni



  • @Badela said in QComboBox dopo selezione, non visualizza più il campo modificato nel modello MySQL:

    Ritorna il valore corretto come effettivamente è presente nella tabella dopo la modifica tramite la combo.

    Come mi aspettavo quindi non capisco dove possa andare a male.
    Se puoi postare l'intero codice magari aiuta



  • @VRonin

    Se devi farlo girare ti serve pure il database... Questa è il compattato della cartella del programma, la classe in questione è "miscele"
    [link text]https://drive.google.com/file/d/14niLOkqtFYoEtmQ1BXAqBN9J7XYl4DIx/view?usp=sharing

    Giovanni


Log in to reply