IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

QDataTable - Tri personnalise d'une colonne


Sujet :

Qt

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Par défaut 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 :

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

    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.

    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); 
    #
         }
    #
    }
    #
    //***********************************************************************//
    J'espere avoir ete clair.Je vous remercie de votre attention

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    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.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    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.

    +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri/Sort d'une colonne d'un DataGrid
    Par NazOok dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 03/04/2014, 11h11
  2. Tri particulier sur une colonne
    Par sab_info dans le forum SSRS
    Réponses: 2
    Dernier message: 15/03/2013, 17h43
  3. tri alphanumérique d'une colonne
    Par aurelien03 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2011, 10h59
  4. Tri ListView sur une colonne de type List<T>
    Par thelpi dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 05/01/2010, 16h46
  5. tri à partir d'une colonne auto_increment
    Par jobrousse dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/11/2009, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo