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 :

Trier un QTableWidget sur plusieurs colonnes


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Par défaut Trier un QTableWidget sur plusieurs colonnes
    Bonjour,

    je cherche comment trier un QTableWidget sur plusieurs colonnes.
    J'ai 2 colonnes NOM et GROUPE. Je veux trier soit
    par NOM et GROUPE
    par GROUPE et NOM
    A la rigueur une solution simple est de créer 2 nouveaux QTableWidgetItem et d'y concaténer les 2 colonnes une fois avec NOM en tête, et l'autre fois avec GROUPE en tête.

    Sauf que cette solution ne permet pas d'obtenir le résultat que je cherche : le problème est avec le tri par GROUPE décroissant. Je veux en effet que les groupes soient décroissants mais je veux que les noms restent croissants dans ce tri.
    Autrement dit, je veux afficher
    GROUPE2 NOM A
    GROUPE2 NOM B
    GROUPE1 NOM X
    GROUPE1 NOM Y... si on préfère, la requête serait ici ORDER BY groupe DESC, nom ASC.

    Pas de QTableView SVP.
    Merci.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Par défaut
    Bon,

    après avoir bien regardé sur internet sans trouver de méthode adaptée au QTableWidget, j'ai transposé une vieille méthode que j'ai dû développer, il y a plusieurs années, dans les TStringGrids de Lazarus quand je travaillais sur le composant natif. D'ailleurs, j'ai totalement transposé le fonctionnement.

    J'ajoute une QTableWidgetItem réservée au tri que j'utilise systématiquement quelque soit le ui->table->horizontalHeader()->sortIndicatorSection()
    Cet Item est construit à chaque changement de SortIndicatorSection.
    Dans le cas que j'évoquais, l'item de tri comprend le Groupe et une méthode InvertLetters(Nom)... Le InvertLetters commence par mettre les lettres (en Latin et) en majuscules et renverse une à une les lettres dans la pile 65-90 des valeurs ASCII :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     c = s.at(i);
     d_ascii =  c.toLatin1();
     if (d_ascii < 78)
         f_ascii = 90- (d_ascii -65);
     else
         f_ascii = 65+ (90 -d_ascii);
     m_res += QString (QChar(f_ascii));
    Cette simple permutation de valeurs ASCII autour du centre de symétrie 77-78 permet d'obtenir l'effet recherché. Donc si je clique sur l'entête de la colonne "Nom", pour un Qt::AscendingOrder, j'obtiens l'équivalent d'un ORDER BY groupe ASC, nom ASC ou dans l'autre sens (DescendingOrder) un ORDER BY groupe DESC, nom ASC évidemment sans recharger la table.
    Compte tenu du fait que la transformation s'exécute en RAM, la latence est acceptable. Il faudrait optimiser le petit bout de code probablement mais pour l'instant cela me conviendra.

    Comme d'habitude, s'il y a mieux je suis preneur : je suis peut être passé à côté de l'essentiel mais au moins le but recherché est atteint.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 107
    Par défaut
    Salut,
    Drôlement compliqué ta solution.
    Sache que tu peux faire plusieurs sortByColumn à la suite.
    Prends l'exemple "Custom Sort/Filter Model Example" disponible dans la liste des exemples dans QtCreator.
    Dans la fonction createMailModel du main.cpp , remplace les addMail... par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    addMail(model, "GROUPE_1", "NOM_X",
    		QDateTime(QDate(2006, 12, 31), QTime(17, 03)));
    addMail(model, "GROUPE_1", "NOM_Y",
    		QDateTime(QDate(2006, 12, 22), QTime(9, 44)));
    addMail(model, "GROUPE_2", "NOM_A",
    		QDateTime(QDate(2006, 12, 25), QTime(11, 39)));
    addMail(model, "GROUPE_2", "NOM_B",
    		QDateTime(QDate(2007, 01, 02), QTime(16, 05)));
    Puis dans le window.cpp, recherche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proxyView->sortByColumn(1, Qt::AscendingOrder);
    et ajoute à la suite (donc juste derrière le premier sortByColumn) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proxyView->sortByColumn(0, Qt::DescendingOrder)
    et tu auras le comportement souhaité.
    Certes c'est du QTableView, mais QTableWidget hérite de QTableView donc cela devrait fonctionner.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 107
    Par défaut
    A toi ensuite de gérer ta pile de sortByColumn comme le fait qtitandatagrid : http://www.devmachines.com/qtitandatagrid-overview.html

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Par défaut
    Bonjour,
    Merci pour ta réponse.

    Citation Envoyé par loupium Voir le message
    Sache que tu peux faire plusieurs sortByColumn à la suite.
    Ah ? Sous quelles conditions ?
    La portabilité View/Widget ? Dans ce cas précis, je ne sais pas. Mes recherches Web sur la question me montrent que l'utilisation d'un QSortFilterProxy est problématique et presque dans tous les cas non fonctionnelle. Ce qui ne signifie pas que cela ne fonctionne pas : ceux qui arrivent à l'utiliser dans ces circonstances n'ont pas de raison de laisser de messages. Mais pour tous ceux qui peinent, la conclusion est presque dans tous les cas : "Utilisez un QTableView à la place d'un QTableWidget." Et dans le cas précis, je ne veux pas de QTableView.

    J'essaierai de dégager le code minimal pour atteindre mon objectif dans l'exemple que tu cites parce que franchement, en l'état, il est tout à fait inexploitable pour mon problème à peu de frais.

    Quant à mon approche, elle ne me semble pas spécialement compliquée et elle est transposable dans n'importe quel langage et indépendante des objets, en tout cas sur des Grids "mémoire". Elle n'est pas nécessairement faite pour Qt mais transposable à peu de frais et en peu de lignes

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 107
    Par défaut
    Tu réédites tes anciens messages ?
    Car cela fait 2 fois que je vois un message différent !

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

Discussions similaires

  1. [WD18] Excel Ole Automation Trier sur plusieurs colonnes
    Par dany13 dans le forum WinDev
    Réponses: 13
    Dernier message: 04/07/2015, 07h48
  2. [OpenOffice][Tableur] Comment trier numéros sur plusieurs colonnes par ordre croissant
    Par bordelaplage dans le forum OpenOffice & LibreOffice
    Réponses: 8
    Dernier message: 10/04/2015, 23h16
  3. Trier sur plusieurs colonnes
    Par tidusff10 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 09/06/2012, 19h17
  4. trier un stringgrid sur plusieurs colonnes
    Par renegade55 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 13/12/2005, 16h30
  5. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22

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