Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Mettre à jour un ComboBox lors d'une modif en base de données



  • Bonjour,
    Je charge actuellement un ComboBox avec une base de données que je peux mettre à jour depuis mon programme.
    Problème lorsque je modifie la base, je suis obligé de redémarrer mon programme pour que les nouvelles valeurs apparaissent dans mon comboBox.
    Question : Quelqu'un connait-il la méthode à utiliser pour faire une mise à jour en temps réel ?
    D'avance merci !


  • Lifetime Qt Champion

    Bonjour,

    Comment est-ce que la combox est chargée ?
    Comment est-ce que la base de données est changée ?



  • En fait, je charge ma ComboBox dans ma mainWindows après avoir ouvert ma base de données :
    Code ci dessous

    /********************************************************
    Ouverture de la Base de données dans la MainWindows*
    ********************************************************/

        if (!connOpen())
        {
           ui->label_Status->setText("Failed to open the DataBase");
    
        }
        else {
           ui->label_Status->setText(("Connected to DataBase....."));
        }
    
        /********************************************************
         * requête pour remplir la Combo Box avec la colonne valeur de la Base de données*
         ********************************************************/
        QSqlQuery query;
        query.prepare("SELECT Valeur FROM Bourse_TTF"); //remplir le combo Box
        QSqlQueryModel *modal=new QSqlQueryModel();
        query.exec();
        modal->setQuery(query);
        ui->comboBox->setModel(modal); //chargement ComBo
    

    Puis dans une Qdialog, je peux ajouter ou modifier des valeurs à ma base données avec le code suivant :
    /********************************************************
    * Qdialog modif base de donnees *
    ********************************************************/

    void DataBase_Dialog::on_Valid_Data_pushButton_2_clicked()
    {

    NewValeur=ui->NewValeur_lineEdit->text();
    NewTTF=ui->NewTTF_lineEdit_3->text();
    New_Symbole=ui->NewSymbole_lineEdit_2->text();
    id=ui->id_lineEdit->text();
    QSqlQuery query;
    query.prepare("INSERT INTO Bourse_TTF (eid,Valeur,Symbole,TTF) VALUES ('"+id+"','"+NewValeur+"','"+New_Symbole+"','"+NewTTF+"')");
    //query.prepare("INSERT INTO Bourse_TTF (Valeur,Symbole,TTF) VALUES ('"+id+"','"+NewValeur+"','"+New_Symbole+"','"+NewTTF+"')");
    
    if (query.exec())
    {
        QSqlQuery query;
        query.prepare("SELECT * FROM Bourse_TTF");
        QSqlQueryModel *modal=new QSqlQueryModel();
        query.exec();
        modal->setQuery(query);
        ui->tableView->setModel(modal);
        QMessageBox::information(this, "DataBase", "inser data OK !");
    
    
    
    }
    else
        {QMessageBox::critical(this,tr("error::"),query.lastError().text());}
    

    }

    Quand je lance le programme, ça fonctionne !
    Lorsque j'ajoute une valeur dans ma base de données, celle ci est bien prise en compte. Le seul hic ! c'est qu'elle n'est pas rafraichie dans le comboBox qui est situé dans la mainWindows.
    Je suis obligé de fermer et relancer le programme pour retrouvé la nouvelle valeur dans le comboBox.
    Je pense qu'il faut envoyer un signal ou quelque chose comme ça pour dire au comboBox de mettre à jour ses valeurs lorsque la base de données est modifié mais j'vois pas comment faire.
    Je vois pas bien comment interagir entre une MainWindows et une Qdialog ???



  • @yoyo Bonjour, à la lecture du code, je vois dans l'initialisation:

    ui->comboBox->setModel(modal); //chargement ComBo
    

    Et dans la partie actualisation:

    ui->tableView->setModel(modal); // devrais être, à mon avis ui->comboBox->setModel(modal)
    

    Et personnellement, je changerais cela en:

    if (query.exec())
    {
        ui->comboBox->clear();
        static_cast<QSqlQueryModel *>(ui->comboBox->model())->exec();
        QMessageBox::information(this, "DataBase", "inser data OK !");
    }
    

Log in to reply