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 :

Tri qui ne s'applique pas sur toutes les colonnes


Sujet :

Qt

  1. #1
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Points : 83
    Points
    83
    Par défaut Tri qui ne s'applique pas sur toutes les colonnes
    Bonjour tout le monde,
    J'ai rempli une liste de type QTableView avec les résultat d'une requête.
    Ensuite, j'ai voulu appliquer un tri sur toutes les colonnes de la liste.
    Le problème c'est que le tri fonctionne pour quelques colonnes mais ne fonctionne pas avec d'autres.
    Le code source que j'ai utilisé est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    QSqlQueryModel *modelAb = new QSqlQueryModel(this);
    modelAb ->setQuery(query, dbConnexion);
    while(modelAb->canFetchMore())
    	modelAb->fetchMore();
     
    QSortFilterProxyModel * mSortFilterModel = new QSortFilterProxyModel(this);
    mSortFilterModel->setDynamicSortFilter(true);
    mSortFilterModel->setSourceModel(modelAb);		
    tabAbonne->setModel(mSortFilterModel);
    tabAbonne->setSortingEnabled(true);
    Est ce que quelqu'un pourrait m'aider à résoudre ce problème.
    Cordialement.

  2. #2
    Membre averti
    Avatar de DaveShot
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 238
    Points : 384
    Points
    384
    Par défaut
    Bonjour mercure07,

    je pense qu'il te manque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mSortFilterModel->sort(n, Qt::AscendingOrder);
    ou n correspond à l'indice de ta/tes colonne(s) à ordonner.

    En espérant t'avoir aidé,
    Cdlt.
    - N'hésitez pas à consulter les liens vers les FAQs, les cours et tutoriels -

    Daveshot

  3. #3
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Points : 83
    Points
    83
    Par défaut
    Bonjour,
    Merci de votre réponse mais le problème provenait que le la fonction sort ne prend pas en charge tous les types de données.
    C'est pour cela que le filtre des integer, date, etc. ne fonctionne pas correctement.
    La solution consiste en une implémentation de la fonction lessThen comme suit :
    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
    bool MySortFilterProxyModel::lessThan(const QModelIndex &left,
                                           const QModelIndex &right) const
     {
         QVariant leftData = sourceModel()->data(left);
         QVariant rightData = sourceModel()->data(right);
     
         if (leftData.type() == QVariant::DateTime) {
             return leftData.toDateTime() < rightData.toDateTime();
         } 
    	 else if (leftData.type() == QVariant::Int) {
             return leftData.toInt() < rightData.toInt();
         }  
    	 else {
             QRegExp *emailPattern = new QRegExp("([\\w\\.]*@[\\w\\.]*)");
     
             QString leftString = leftData.toString();
             if(left.column() == 1 && emailPattern->indexIn(leftString) != -1)
                 leftString = emailPattern->cap(1);
     
             QString rightString = rightData.toString();
             if(right.column() == 1 && emailPattern->indexIn(rightString) != -1)
                 rightString = emailPattern->cap(1);
     
             return QString::localeAwareCompare(leftString, rightString) < 0;
         }
     }
    En espérant que cela pourrait aider.
    Cordialement.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/10/2010, 22h47
  2. .bat qui ne marche pas sur tout les postes
    Par guismoman33 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 06/08/2008, 11h52
  3. [JXTable] Tri mais pas sur toutes les lignes
    Par grabriel dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 12/07/2007, 09h17
  4. Requete qui ne fonctionne pas sur toutes les versions de MySQL
    Par goldorax113 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h04
  5. Réponses: 9
    Dernier message: 07/05/2003, 12h57

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