Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > C et C++ > Bibliothèques > Qt

Qt Forum d'entraide technique sur la bibliothèque Qt. Avant de poster -> F.A.Q Qt

Réponse
 
Outils de la discussion
Vieux 12/11/2008, 12h08   #1 (permalink)
Invité de passage
 
Date d'inscription: novembre 2008
Messages: 2
Par défaut [Qt3-Linux] QDataTable - Tri personnalise d'une colonne

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 :

//staff//
-----------------------------------
|| id_staff (int) ||
-----------------------------------
|| 12 ||
|| 23 ||
|| 37 ||
------------------------------------

//personnel//
-----------------------------------------------------------------
|| id(int) || name (varchar) ||
-----------------------------------------------------------------
|| 12 || Ringo ||
|| 23 || John ||
|| 37 || Paul ||
------------------------------------------------------------------

myTable sera affichee de la maniere suivante
(Le tri des elements est definie par une colonne non mentionnee ici. C'est la colonne initiale de tri pour la table)

(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)

(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.

( 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.

Code :
#
//***********************************************************************//
#
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); 
#
     }
#
}
#
//***********************************************************************// 
J'espere avoir ete clair.Je vous remercie de votre attention
Charlie37 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 09h48   #2 (permalink)
Membre Confirmé
 
Date d'inscription: mai 2007
Localisation: Brest
Âge: 21
Messages: 291
Par défaut

Salut,

Bon, je n'ai jamais bidouillé le module QtSql, et Qt3 me semble un peu obsolète aujourd'hui, cependant, je pense pouvoir répondre à ta question :

Au lieu à chaque itération de :
-récupérer le id_staff(int)
-chercher la correspondance(QString)
-afficher le résultat

tu devrais :
-récupérer le id_staff(int)
-chercher la correspondance(QString)
-ajouter ton QString dans une QStringList
une fois que toute ta table est parcourue
-ma QStringList.sort()
-tu parcours ta QStringList et tu "peins" le résultat avec chaque string.

Enfin, je pense qu'il y'a des solutions prévues pour ça, mais pour les raisons citées plus hauts, je suis incapable de te les donner.

Bonne chance,

G.
Gulish est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/11/2008, 17h16   #3 (permalink)
Invité de passage
 
Date d'inscription: novembre 2008
Messages: 2
Par défaut

Merci Gulish, je vais essayer ta methode.
Qt4 semble disposer de fonctionnalites plus intuitives pour gerer le Sql, mais je suis oblige de continuer avec Qt3 sur ce projet.

+
Charlie37 est déconnecté   Envoyer un message privé Réponse avec citation
NEWS QTFAQ QtTUTORIELS QtOUTILS QtLIVRES QtBLOG QtQt TV

Réponse

Précédent   Forum des développeurs > C et C++ > Bibliothèques > Qt



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide


Fuseau horaire GMT +1. Il est actuellement 05h05.


Publiez vos articles, tutoriels et cours et rejoignez-nous dans l'équipe de