Bonjour tout le monde
Quelqu'un a-t-il deja gere des bases de donnees avec Qt ? Connaissez-vous alors les QDataTable qui permettent d'afficher le contenu d'une table ?
J'ai une classe myTable qui herite de QDataTable. Elle me permet de recuperer les donnees d'une table d'une base de donnees MySql.
J'utilise un QSqlCursor sur une table de la base nommee "staff" : je peux alors inserer/modifier/supprimer des elements de la table tres simplement.
Une colonne de myTable contient des identifiants "id_staff", qui font reference a une autre table nommee "personnel".
Ensuite, c'est la methode paintField() qui est appelee automatiquement pour dessiner le contenu de chaque champ de myTable. J'ai surcharge cette methode pour les "id_staff" : ainsi, on n'affiche pas ces identifiants tels quels mais on va chercher dans la table "personnel" le nom qui correspond, et c'est lui que l'on affiche.
Voici un exemple avec les tables "staff" et "personnel" suivantes :
myTable sera affichee de la maniere suivante
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 //staff// ----------------------------------- || id_staff (int) || ----------------------------------- || 12 || || 23 || || 37 || ------------------------------------ //personnel// ----------------------------------------------------------------- || id(int) || name (varchar) || ----------------------------------------------------------------- || 12 || Ringo || || 23 || John || || 37 || Paul || ------------------------------------------------------------------
(Le tri des elements est definie par une colonne non mentionnee ici. C'est la colonne initiale de tri pour la table)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 (myTable) Name -------------------------------------- || Ringo || || Paul || || John ||
Si je clique sur le header de la colonne, elle se trie selon les id_staff (qui est la reelle valeur que contiennent les champs)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 (myTable after header click) Name -------------------------------------- || Ringo || || John || || Paul ||
Mais je prefererais trier la colonne selon le nom qu'affiche les elements. La colonne serait triee par ordre alphabetique, cela serait plus parlant pour l'utilisateur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ( myTable after header click) Name -------------------------------------- || John || || Paul || || Ringo ||
Mais voila, je suis a court d'idees.
- Un QSqlCursor est efficace si l'on veut avoir acces a et modifier les champs d'une seule table, mais comment faire si l'on veut lier deux tables entre elles ? C'est quand meme une pratique assez courante quand on manipule des bases de donnees.
- Existe-t-il une methode pour comparer les items d'une QDataTable ? Ou pour trier une colonne donnee ? Je n'ai pas trouve.
Voici un resume du code.
J'espere avoir ete clair.Je vous remercie de votre attention
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 # //***********************************************************************// # myTable::myTable(...) # { # ... # QSqlCursor* cursor = new QSqlCursor ("staff"); # setSqlCursor(cursor); # # //Je recupere cinq colonnes de la table, mais voici celle qui m'interesse ici # addColumn("id_staff", "Name"); # ..... # # setSorting( true ); # # .... # } # # myTable::paintField(QPainter *p, const QSqlField *field, # const QRect& cr, bool selected) # { # if( ! field ) # return; # # .... # if ( field->name() == "id_staff" ) # { # int id = field->value().toInt(); # # //A partir du id_staff, je recupere le nom correspondant dans la table "personnel" # QString name = recupereNom(id); # # p->drawText( 2, 2, cr.width() - 4, cr.height() - 4, Qt::AlignLeft, name); # } # } # //***********************************************************************//![]()
Partager