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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } } }
Voilà si quelqu'un à une idée d'où vient mon erreur je lui suis reconnaissante d'avance, merci
Partager