Insertion dans une QListView
Bonjour, après de nombreux essais je n'arrive pas à identifier la source de mon problème. Je vais essayer d'être le plus clair possible.
Je veux créer une interface graphique grâce à Qt qui communique avec une BD MySQL.
J'ai une QListView que j'ai associée à un model qui affiche les pièces/produits associées au projet qui à été préalablement sélectionné (il y'a donc un travail de 'tri' pour l'affichage).
Lorsque l'utilisateur clique sur le bouton 'ajouter produit' une fenêtre QDialog modale s'ouvre et permet de rentrer un libellé et une référence. Lorsqu'un utilisateur clique sur le bouton valider de cette QDialog je crée une requête qui rentre ces informations dans la base de donnée.
Voici le code
MainWindow.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| MainWindow::MainWindow(int typeUtilisateur, int id_operation, QString projet, QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
...
// Récupération la liste de pièces associées au projet
query_2.prepare("SELECT * FROM produit WHERE ref_projet = :id_project");
query_2.bindValue(":id_project", id_selected_project);
// On vérifie que des pièces ont été rentrées, si ce n'est pas le cas on envoie un message à l'utilisateur pour l'en informer
if (query_2.exec() && query_2.first())
{
// Réccupère l'index de la colonne du champ ns_interne dans la table produit
ns_interne_col = query_2.record().indexOf("ns_interne");
model = new QSqlTableModel(this);
model->setTable("produit");
//All changes to the model will be applied immediately to the database.
model->setEditStrategy(QSqlTableModel::OnFieldChange);
model->select();
// On insert dans la liste le model en précisant la colonne
ui->piecesListView->setModel(model);
// On enlève les lignes de produit qui ne correspondent pas au projet actuel
for(int i=0; i < model->rowCount(); i++){
index_1 = model->index(i, query_2.record().indexOf("ref_projet"));
if(!(model->data(index_1).toInt() == id_selected_project))
{
ui->piecesListView->setRowHidden(i, true);
}
}
ui->piecesListView->setModelColumn(ns_interne_col);
}
else
{
QMessageBox::information(this,"Aucun produit enregistré","Aucune pièce n'a encore été enregistrée pour ce projet \n"
"pour rentrer de nouvelles pièces appuyez sur le bouton 'ajouter pièces' situé sous la liste des pièces");
}
// Fin de récupération de la liste de pièces associées au projet
}
// Gestion de l'ajout d'une pièce dans le projet
void MainWindow::on_ajouterPiecesButton_clicked()
{
AjouterProduit* ajoutProd;
ajoutProd = new AjouterProduit(id_selected_project, selectIdOperation, 0);
ajoutProd->setModal(true);
ajoutProd->show();
if (!ajoutProd->exec())
{
qDebug() << "Je rentre dans la boucle";
model->select();
// On enlève les lignes de produit qui ne correspondent pas au projet actuel
for(int i=0; i < model->rowCount(); i++){
index_1 = model->index(i, query_2.record().indexOf("ref_projet"));
if(!(model->data(index_1).toInt() == id_selected_project))
{
ui->piecesListView->setRowHidden(i, true);
}
}
ui->piecesListView->setModelColumn(ns_interne_col);
}
}
// Fin de gestion de l'ajout d'une pièce dans le projet |
ajoutdepiece.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| // Si l'utilisateur clique sur le bouton valider
void AjouterProduit::on_pushButton_clicked()
{
if ((ui->numeroSerieLineEdit->text()).isEmpty())
{
QMessageBox::information(this,"Champ vide","Veuillez remplir tous les champs");
}
else
{
query_1.prepare("SELECT * FROM produit WHERE ref_projet = :ref_projet AND ns_interne = :ns_interne");
query_1.bindValue(":ref_projet", ref_selected_project);
query_1.bindValue(":ns_interne", ui->numeroSerieLineEdit->text());
if (query_1.exec() && query_1.first())
{
QMessageBox::information(this,"Produit déjà enregistré","Le numéro de série que vous avez rentré existe déjà dans la base de données");
}
else
{
query_2.prepare("INSERT INTO produit VALUES(:id_produit, :ns_interne, :ns_client, :version, :ref_projet, 'OK', :ref_oper)");
query_2.bindValue(":id_produit", NULL);
query_2.bindValue(":ns_interne", ui->numeroSerieLineEdit->text());
query_2.bindValue(":ns_client", NULL);
query_2.bindValue(":version", ref_selected_version);
query_2.bindValue(":ref_projet", ref_selected_project);
query_2.bindValue(":ref_oper", ref_selected_oper);
query_2.exec();
close();
}
}
} |
Mon problème est que cette manière de procéder marche très bien si au moins une pièce se trouve déjà dans la QListView. Mais l'application cesse de fonctionner s'il s'agit de la première pièce.
Voilà si quelqu'un à une idée d'où vient mon erreur je lui suis reconnaissante d'avance, merci :)