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 :

QTableView et changement de couleur des lignes conditionnel


Sujet :

Qt

  1. #1
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 215
    Points : 226
    Points
    226
    Par défaut QTableView et changement de couleur des lignes conditionnel
    Bonjour,

    j'ai un QTableView qui comprends 5 colonnes.
    Je voudrai que lorsque le chiffre de la dernière colonne augmente à la ligne suivante la couleur de fond de toute la ligne soit verte.

    ex un petit tableau :
    A:B:C:D:E:
    0:1:0:1:2:
    0:1:1:1:2:
    0:1:1:1:3: -----> cette ligne devrait donc être coloriée en vert.
    0:1:0:1:2:

    Je pense que cela doit se faire via un delegate mais je ne vois pas comment...
    Quelqu'un aurait il un exemple?
    Merci
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    octobre 2004
    Messages
    11 512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 512
    Points : 29 910
    Points
    29 910
    Par défaut
    Salut,

    Pour résoudre ton problème, tu devrais utiliser la notion de modèle, et définir, pour être précis, la fonction data de ton modèle en indiquant exactement ce qu'il faut faire dans le cas où la vue veut obtenir la couleur d'arrière plan (case Qt::BackgroundRole)

    Tu n'auras "qu'à" choisir correctement le test qui vérifiera dans quelles conditions changer la couleur de fond

    Il y a un exemple très clair à ce sujet dans le tutoriel de Qt concernant le concept de model / view.

    La seule différence par rapport à tes besoin, c'est qu'ils ont choisi la couleur rouge
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 215
    Points : 226
    Points
    226
    Par défaut
    Merci de ta réponse mais j'ai omis de précisé que le modele qui fournit les données à mon tableau est un QSqlQueryModel et non pas un QAbstractTableModel. Du coup je ne peux pas procéder ainsi me semble t il.
    Edit : Ah si ça marche mais j ai toujours le problème de la détection de la variation de la donnée contenue dans le QModelIndex à résoudre....
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  4. #4
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 215
    Points : 226
    Points
    226
    Par défaut
    Je parviens à changer la couleur du background effectivement,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QVariantModeleFenTrafic::data(constQModelIndex&index,introle)const { //!REIMPLEMENTATIONDEQSqlQueryModel 
    switch(role){ 
    caseQt::BackgroundRole:if(index.data().toString().contains("7"))//changebackground pour toutes les valeurs contenant 7 { QBrushredBackground(Qt::red); returnredBackground; }break;default: break; } //onrenvoieladonnée returnQSqlQueryModel::data(index,role); }
    Donc voilà ce que j'ai fait mais je ne sais pas du tout comment comparer la valeur contenue dans le QModelIndex courant à celle du QModelIndex de la ligne du dessus. Je rame... Ca fait un moment que je n'ai pas touché à Qt, ça va revenir mais là... je rame
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  5. #5
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 215
    Points : 226
    Points
    226
    Par défaut
    alors voila ce que j'ai fait :
    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
    
    QVariantModeleFenTrafic::data(constQModelIndex&index,introle)const 
    { 
        //!REIMPLEMENTATIONDEQSqlQueryModel 
        switch(role){
           caseQt::BackgroundRole: 
           int ligneCourante=index.row();
           int lignePrecedente=ligneCourante-1; 
           if(lignePrecedente<=0) lignePrecedente=0;
    
            int valeurPrecedente=index.model()->data(index.model()->index(lignePrecedente,38)).toInt();         
           int valeurCourante=index.model()->data(index.model()->index(ligneCourante,38)).toInt();
           if(valeurCourante>valeurPrecedente)
           { 
                  QBrush newBackground(Qt::red); 
                  return newBackground;
           } 
      
           break; 
        } 
        //onrenvoieladonnée 
        return QSqlQueryModel::data(index,role); 
    }
    ALors ça marche bien, la cellule passe en rouge quand savaleur est supérieure à la suivante.
    Maintenant, je voudrai améliorer la chose de telle sorte que si la cellule précédente est déjà en rouge, la cellule actuelle passe en vert.
    Mais je ne trouve pas la méthode permettant d'obtenir la couleur affectée à une cellule. Quelqu'un saurait comment procéder?
    merci
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    octobre 2004
    Messages
    11 512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 512
    Points : 29 910
    Points
    29 910
    Par défaut
    Pour cela, je te proposerais bien de "mettre en cache" (dans ton modèle) la liste des cellules qui nécessitent une "attention particulière".

    De cette manière, tu n'aurait "qu'à" corriger ton test pour lui donner une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(valeurCourante>valeurPrecedente)
           { 
                  if(/* la cellule précédante est rouge */){
                       QBrush newBackground(Qt::green); 
                       return newBackground;
                  }
                  QBrush newBackground(Qt::red); 
                  return newBackground;
           }
    Resterait donc à mettre ces informations en cache

    Je te proposerais bien de partir sur une structure toute bête qui permettra de représenter la ligne et la colonne d'une cellule, qui serait proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct RedCell{
        RedCell(int row, int column):row{row}, column{column}{
        }
        int row;
        int column;
    };
    Comme nous envisageons de rechercher des données qui seront -- de toutes manières unique (il n'y a qu'une seule cellule à la ligne L et à la colonne C ), nous utiliserions bien std::set pour maintenir ces inforamtions "en cache". Mais, pour cela, il faut au minimum l'opérateur de comparaison <. On va donc le définir pour notre structure sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool operator <(RedCell const & a, RedCell const & b){
        return a.row <b.row ||
                   a.row == b.row && a.column < b.column);
    }
    Grâce à cela, nous pourrons rajouter le cache des cellules qui sont en rouge dans le modèle, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class QVariantModeleFenTrafic{
        /* tout ce que tu as déjà mis dans la classe */
    private:
        std::set<RedCell> redCells;
    };
    Et, du coup on va "gentiment" veiller à introduire les cellules rouges dans le set avant de renvoyer la couleur rouge.

    On corrige donc encore une fois le test pour lui donner la forme (et on en profite pour corriger la condition)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(valeurCourante>valeurPrecedente)
           { 
                  if(index.column()>0 && redCells.find(RedCell{index.row(),index.column-1})!= redCells.end()){
                       QBrush newBackground(Qt::green); 
                       return newBackground;
                  }
                  redCells.insert(RedCell{index.row(), index.column()});
                  QBrush newBackground(Qt::red); 
                  return newBackground;
           }
    Et voilà, les choses devraient fonctionner comme tu le souhaite
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 215
    Points : 226
    Points
    226
    Par défaut
    Merci pour cette solution.
    A vrai dire je préférai éviter d'utiliser un cache parce que mes tableaux sont super longs (>100 000 lignes) et du coup je voulais plutôt lire la couleur précédente tout simplement.
    Je me demandais donc si on pouvait obtenir la couleur de fond d'une cellule par une fonction particulière propre à Qt?
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    octobre 2004
    Messages
    11 512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 512
    Points : 29 910
    Points
    29 910
    Par défaut
    Citation Envoyé par katanaenmousse Voir le message
    Merci pour cette solution.
    A vrai dire je préférai éviter d'utiliser un cache
    Tu es venu avec un problème mal défini, j'ai exprimé une solution susceptible d'y être adaptée.

    Tu peux refuser cette solution, bien sur, mais cela laissera ton problème en suspend!

    parce que mes tableaux sont super longs (>100 000 lignes)
    Et, de quoi as-tu peur exactement

    De la quantité de mémoire que la mise en cache utilisera

    Je peux te rassurer tout de suite : la structure que je donne représente une taille en mémoire de quoi ... 8 bytes (deux entiers 32bits).

    Si l'on rajoute les informations qui permettent de relier les différents éléments d'un arbre binaire entre eux, il faut rajouter l'équivalent de deux pointeurs. Soit 2x 8 byte au maximum. Pour chaque cellule que tu voudrais mettre en cache, tu dois donc compter sur l'utilisation de ... 24 bytes "à tout casser"

    Même avec 100 000 lignes dans ta table, étant donné que tu ne peux pas avoir deux cellules rouges qui se suivent, tu finirait -- au pire -- avec quoi 50 000 cellules en cache soit 50 000 x 24 bytes : 1 200 000 bytes d'utilisés (maximum 1Mb de mémoire)

    Heu... rappelles moi, ton ordinateur, il dispose de combien de RAM N'est-ce pas tout près des 8Gb

    Ou alors, tu as peur que la recherche ne mette un temps décidément excessif pour fournir un résultat C'est justement la raison pour laquelle j'ai décidé d'utiliser un std::set: parce que la recherche se fait avec une complexité logarithmique (en O(log(N)) ) : Dans le pire des cas, avec 100 000 cellules mises en cache, il te faudra ... 17 comparaisons pour s'assurer de la présence (ou de l'absence) d'une cellule dans le cache.

    Ce n'est vraiment pas le genre de chose qui risque de ralentir ton IHM
    et du coup je voulais plutôt lire la couleur précédente tout simplement.

    Je me demandais donc si on pouvait obtenir la couleur de fond d'une cellule par une fonction particulière propre à Qt?
    non, tu ne peux décemment pas faiire cela :

    Le modèle n'a rien à foutre de la manière dont les données sont représentées dans la vue. Et il n'a d'ailleurs aucun moyen de s'y intéresser.

    Si tu veux "garder une trace" -- au niveau du modèle -- des cellules pour lesquelles le modèle a défini "quelque chose de spécial" (comme la couleur de fond), tu n'as pas vraiment d'autre choix que de faire en sorte de disposer de cette liste ... au niveau du modèle
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 215
    Points : 226
    Points
    226
    Par défaut
    Bonjour Koala,
    ce qui m'inquiétait c'est ce que tu évoques ici :
    Ou alors, tu as peur que la recherche ne mette un temps décidément excessif pour fournir un résultat C'est justement la raison pour laquelle j'ai décidé d'utiliser un std::set: parce que la recherche se fait avec une complexité logarithmique (en O(log(N)) ) : Dans le pire des cas, avec 100 000 cellules mises en cache, il te faudra ... 17 comparaisons pour s'assurer de la présence (ou de l'absence) d'une cellule dans le cache.
    Mais me voilà rassuré.
    Je vais essayer d'appliquer ce que tu as proposé.
    Merci encore pour ton aide.
    Je repasse pour te dire ce que ça donne.
    Merci et à bientôt
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  10. #10
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 215
    Points : 226
    Points
    226
    Par défaut
    Alors voilà ce que j'ai fait mais ça génère des erreurs

    Mon .h

    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
    #ifndef MODELEFENTRAFIC_H 
    #define MODELEFENTRAFIC_H
    #include <QWidget> 
    #include <QSqlQueryModel> 
    #include <QVariant> 
    #include <set>
    class ModeleFenTrafic : public QSqlQueryModel { 
        Q_OBJECT  
    public: 
        explicit ModeleFenTrafic(QObject*parent=0);
        QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const Q_DECL_OVERRIDE; 
    
    private: 
        std::set <int> lignesVertes; 
    }; 
    #endif //MODELEFENTRAFIC_H
    Mon .cpp
    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
    #include"modelefentrafic.h"
    ModeleFenTrafic::ModeleFenTrafic(QObject*parent) : QSqlQueryModel(parent) { 
    
    }
    
    QVariant ModeleFenTrafic::data(const QModelIndex &index, int role) const {  
         switch(role) {
             case Qt::BackgroundRole:
    
             int ligneCourante=index.row();
             int lignePrecedente=ligneCourante-1;
             if(lignePrecedente<=0) lignePrecedente=0; 
             if(ligneSuivante>=index.model()->rowCount()) ligneSuivante=index.model()->rowCount(); 
             // je ne m'intéresse qu'à la colonne 38 
             QString valeurPrecedente=index.model()->data(index.model()->index(lignePrecedente,38)).toString();
             QStringvaleurCourante=index.model()->data(index.model()->index(ligneCourante,38)).toString(); 
             if(valeurCourante==valeurPrecedente) 
             {  
                  std::set<int>::iterator it=find(lignesVertes.begin(),lignesVertes.end(),lignePrecedente);
                 if(it!=lignesVertes.end())
                 { 
                      lignesVertes.insert(index.row()); 
                      QBrush newBackground(Qt::green); 
                      return newBackground; 
                 } 
                 else 
                 { 
                      QBrush newBackground(Qt::blue); 
                      return newBackground; 
                 } 
             } 
             else 
             {
                 std::set<int>::iterator it=find(lignesVertes.begin(),lignesVertes.end(),lignePrecedente);
                 if(it!=lignesVertes.end())
                { 
                       QBrush newBackground(Qt::blue); 
                       return newBackground; 
                   }
                   else 
                   {
                       lignesVertes.insert(index.row()); 
                       QBrush newBackground(Qt::green); 
                       return newBackground; 
                    } 
              } 
              break;
         } 
    return QSqlQueryModel::data(index,role); 
    }
    Et j'obtiens les erreurs suivantes :

    modelefentrafic.cpp:91: erreur : no matching function for call to 'std::set<int>::insert(int) const'
                     lignesVertes.insert(index.row());
                                                    ^
    et ça pour les deux .insert()

    je pense que le .insert() ne fonctionne pas parce que nous sommes dans une fonction "const" . Mais comment modifier un cache alors vu que nous sommes dans une fonction const?

    J'avoue que je ne vois pas comment régler ça....
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    octobre 2004
    Messages
    11 512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 512
    Points : 29 910
    Points
    29 910
    Par défaut
    Déclares ton set comme étant mutable... Il est vrai que j'avais oublié que nous étions dans une fonction const
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  12. #12
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 215
    Points : 226
    Points
    226
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Déclares ton set comme étant mutable... Il est vrai que j'avais oublié que nous étions dans une fonction const
    mutable?? c'est à dire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mutable std::set<int> monCache;
    Il me semblait avoir lu quelque part qu'il fallait éviter "mutable"?
    Mais en même temps je ne vois vraiment pas d'autre solution non plus.
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  13. #13
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    octobre 2004
    Messages
    11 512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 512
    Points : 29 910
    Points
    29 910
    Par défaut
    Citation Envoyé par katanaenmousse Voir le message
    Il me semblait avoir lu quelque part qu'il fallait éviter "mutable"?
    Mais en même temps je ne vois vraiment pas d'autre solution non plus.
    Comme n'importe quelle possibilité avancée, il s'agit d'être particulièrement prudent lorsqu'on décide d'y avoir recours.

    Le gros problème du mot clé mutable, c'est qu'il jette la const-correctness aux orties, dans le sens où la présence du terme mutable ne t'autorise plus à penser que "ligneVertes ne sera pas modifié par la fonction const".

    Cependant, dans un certain sens, on peut s'en foutre royalement, car ligneVertes n'est qu'une "représentation secondaire" de la partie constante (ton modèle, qui est le résultat d'une requête SQL), et que les modifications qu'il subit sont limitées à une seule et unique fonction (qui n'est pas sensée modifier le modèle): la fonction data() const.

    C'est donc en "parfaite connaissance de cause" que l'on peut envisager l'utilisation de mutable, car nous pouvons écrire en lettres de feu dans la documentation que "seule la fonction data a le droit de modifier ligneVertes ".

    Plus tard, lorsque tu auras eu le temps d'oublier les raisons pour lesquelles tu as rendu ligneVertes mutable, il faudra toujours bien veiller à relire ta documentation, et à ne pas essayer de modifier ligneVertes ailleurs que dans la fonction data, mais ca, c'est un problème qui pourrait même ne jamais se présenter


    Ceci dit, il y a pourtant une autre solution:

    Vu que ton std::set ne sera utilisé que dans une seule fonction, fais en une variable de la fonction au lieu d'en faire une variable de ton modèle; et, pour que chaque exécution de la fonction puisse récupérer le contenu "déjà existant", rend ton std::set static :
    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
    Variant ModeleFenTrafic::data(const QModelIndex &index, int role) const {  
         static std::set<int> ligneVertes;
         switch(role) {
             case Qt::BackgroundRole:
     
             int ligneCourante=index.row();
             int lignePrecedente=ligneCourante-1;
             if(lignePrecedente<=0) lignePrecedente=0; 
             if(ligneSuivante>=index.model()->rowCount()) ligneSuivante=index.model()->rowCount(); 
             // je ne m'intéresse qu'à la colonne 38 
             QString valeurPrecedente=index.model()->data(index.model()->index(lignePrecedente,38)).toString();
             QStringvaleurCourante=index.model()->data(index.model()->index(ligneCourante,38)).toString(); 
             if(valeurCourante==valeurPrecedente) 
             {  
                  std::set<int>::iterator it=find(lignesVertes.begin(),lignesVertes.end(),lignePrecedente);
                 if(it!=lignesVertes.end())
                 { 
                      lignesVertes.insert(index.row()); 
                      QBrush newBackground(Qt::green); 
                      return newBackground; 
                 } 
                 else 
                 { 
                      QBrush newBackground(Qt::blue); 
                      return newBackground; 
                 } 
             } 
             else 
             {
                 std::set<int>::iterator it=find(lignesVertes.begin(),lignesVertes.end(),lignePrecedente);
                 if(it!=lignesVertes.end())
                { 
                       QBrush newBackground(Qt::blue); 
                       return newBackground; 
                   }
                   else 
                   {
                       lignesVertes.insert(index.row()); 
                       QBrush newBackground(Qt::green); 
                       return newBackground; 
                    } 
              } 
              break;
         } 
    return QSqlQueryModel::data(index,role); 
    }
    Il faudra cependant sans doute chipoter un peu lorsque tu décidera de mettre ton modèle à jour / de modifier les données qui le composent (refaire une requête dans ta base de donnée ) car il faudra trouver le moyen de vider le set uniquement lorsque le contenu du modèle a changé
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  14. #14
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 215
    Points : 226
    Points
    226
    Par défaut
    Bonjour et désolé pour cette longue absence mais raisons professionnelles exigent...

    Alors voilà j'ai fait mon code comme tu l'as proposé. Ca marche très bien et il est vrai que c'est assez rapide.
    le seul problème vient du fait qu'à compte de la ligne 20918 de mon tableau, les couleurs de lignes ne correspondent plus à rien de logique... Alors qu'avant cette ligne tout colle parfaitement.
    Je n'arrive pas à comprendre pourquoi à partir de cette valeur ça bug. A cause du set<int> ???
    Je ne vois pas...
    Quelqu'un aurait une idée?
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  15. #15
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 215
    Points : 226
    Points
    226
    Par défaut
    En réalité cela ne vient pas du code. Ce sont des BUGs d'affichage de QTableView à partir d'environ 20 000 lignes pour moi et sur ubuntu.

    Je ne sais pas si ça fait pareil sur Windows.

    Mais c'est certain que ce sont des bugs d'affichage vu que quand je selectionne une ligne et que je quitte la ligne ensuite elle devient de la bonne couleur. et cela pour toutes les lignes buguées.

    Ca le fait aussi en faisant simplement défiler les lignes du tableau avec la molette de la souris...

    Par contre, je ne sais pas comment résoudre ce problème et si ça persiste ja devrais abandonner l'idee de colorer les lignes ...

    Quelqu'un a déjà été confronté à ça? (Je vais ouvrir un nouveau sujet ça n'a plus rien à voir avec la question initiale.
    merci à toi Koala
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

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

Discussions similaires

  1. Changement de couleur des lignes d'un DATAGRID
    Par 2506LE dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/07/2006, 11h48
  2. C# Changement de couleur des lignes d'une datagrid
    Par Depteam1 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 11/06/2006, 11h31
  3. conditionner la couleur des lignes d'un état
    Par GUYSYS dans le forum Access
    Réponses: 7
    Dernier message: 27/04/2006, 02h41
  4. StringGrid : Couleur des lignes
    Par Caro dans le forum Composants VCL
    Réponses: 7
    Dernier message: 21/02/2006, 09h35
  5. Couleur des lignes dans DBGrid
    Par eddie dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/06/2002, 19h15

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