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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    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

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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 confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    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....

  4. #4
    Membre confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    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

  5. #5
    Membre confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    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

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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

+ 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, 10h48
  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, 10h31
  3. conditionner la couleur des lignes d'un état
    Par GUYSYS dans le forum Access
    Réponses: 7
    Dernier message: 27/04/2006, 01h41
  4. StringGrid : Couleur des lignes
    Par Caro dans le forum Composants VCL
    Réponses: 7
    Dernier message: 21/02/2006, 08h35
  5. Couleur des lignes dans DBGrid
    Par eddie dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/06/2002, 18h15

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