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 :

Couleur d'une ligne avec QIdentityProxyModel


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    employé
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : employé
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut Couleur d'une ligne avec QIdentityProxyModel
    Bonjour,
    Lorsque j'exécute ce code, toute la table est colorée en bleu, mais je voudrais que ce soit la cellule (4,1).
    Merci de m'indiquer comment procéder.
    Voici le 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
    class monModele : public QIdentityProxyModel
    {
     
    public:
     
        monModele(QObject* parent = 0): QIdentityProxyModel(parent)
            { qDebug() << "constructor"; }
     
        QVariant data(const QModelIndex &index, int role) const
           {
           if (role == Qt::ForegroundRole) {
               return QVariant(QBrush (QColor(Qt::blue)));
     
            }
           return QIdentityProxyModel::data(index, role);
     
           }
     
    ............
     
      sqlModele->setQuery(*mRequete);
     
      monModele  *identModel = new monModele();
      identModel->setSourceModel(sqlModele);
     
       qDebug() << "data"<<
                  identModel->data(
                          identModel->index(4,1),
                        Qt::ForegroundRole);
     
           ui->tableView->setModel(identModel);
     
           ui->tableView->show();
    }

  2. #2
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Bonjour,

    La variable "index" passé à data contient les ligne/colonne (index.row() && index.column()) de ton élément à représenter.
    Tu peux faire un if sur ces informations pour avoir un rendu différent.

    ++

  3. #3
    Membre averti
    Homme Profil pro
    employé
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : employé
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut Problème variable Index avec QIdentityProxyModel
    Merci pour votre réponse , j'ai donc mis ceci mais il y a une erreur de compilation au niveau de if...Index. Merci de m'indiquer ce qui provoque l'erreur.
    Voici le nouveau 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
    class monModele : public QIdentityProxyModel
    {
     
    public:
     
        monModele(QObject* parent = 0): QIdentityProxyModel(parent)
            { qDebug() << "constructor"; }
     
        QVariant data(const QModelIndex &index, int role) const
           {
             if (role == Qt::ForegroundRole) {
     
             return QVariant(QBrush (QColor(Qt::blue)));
     
            }
     
                if (index == (index.row()) && (index == index.column())
            {
                     return QVariant();
        }
     
          return QIdentityProxyModel::data(index, role);
     
     
          }

  4. #4
    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,

    Attention, tu dois imbriquer le test concernant la position dans le test concernant le rôle que tu souhaite modifier.

    Pour la couleur de fond, ce serait donc quelque chose comme
    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
    QVariant data(const QModelIndex &index, int role) const
    {
        /* on peut récupérer ces données une bonne fois pour toutes,
         * de manière à pouvoir en profiter "pour n'importe quel role"
         */
         int row = index.row();
         int col = index.column();
         if (role == Qt::ForegroundRole) {
              /* parce que tu veux changer  la couleur de fond
               * uniquement pour la cellule qui se trouve ligne 4 et colonne 1 
               */
              if(row == 4 && col == 1){
                   QColor color{Qt::blue}; // on choisi la couleur
                   return QVariant{color}; // on renvoie un QVariant qui contient la couleur
              }
              /* Si on arrive ici, c'est que c'est une cellule dont la couleur de fond est 
               * la couleur par défaut
               * On renvoie un QVariant non défini
               */ 
              return QVariant{};
         }
         if(role == ForegroundRole)
               /* parce que tu veux changer  la couleur du texte
               * uniquement pour la cellule qui se trouve ligne 10 et colonne 3 
               */
              if(row == 10 && col == 3){
                   QColor color{Qt::red}; // on choisi la couleur
                   return QVariant{color}; // on renvoie un QVariant qui contient la couleur
              }
              /* Si on arrive ici, c'est que c'est une cellule dont la couleur de texte est 
               * la couleur par défaut
               * On renvoie un QVariant non défini
               */ 
              return QVariant{};
     
         }
         /* Tous les autres roles qui pourraient t'intéresser
          * seront définis de la même manière (en veillant à renvoyer une donnée du type
          * adéquat, bien sur
          */
        /* en dernier recours, si on a besoin d'un rôle pour lequel tu n'a rien prévu,
         * on renvoie  un QVariant non défini
         */
        return QVariant{};
    }
    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

  5. #5
    Membre averti
    Homme Profil pro
    employé
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : employé
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut Problème variable Index avec QIdentityProxyModel
    Merci de votre réponse, à présent je comprends mieux ce fonctionnement.
    Il reste cependant un petit problème: Quelle que soit la valeur de index dans identModel->data(identModel->index(10,1), Qt::ForegroundRole);.
    Ici par exemple (10,1) la coloration est toujours en (6,1) comme dans le code suivant:

    Merci d'avance.

    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
    monModele(QObject* parent = 0): QIdentityProxyModel(parent)
            { qDebug() << "constructor"; }
     
        QVariant data(const QModelIndex &index, int role) const override
           {
     
            int row = index.row();
            int col = index.column();
     
     
             if (role == Qt::ForegroundRole)
             {
     
                 if (row == 6 && col == 1)
                 {
                    QColor color(Qt::blue);
                    return QVariant (color);
                 }
             return QVariant();
     
            }
     
             if (role == Qt::ForegroundRole)
             {
                 if (row == 8 && col == 1)
                 {
                    QColor color(Qt::red);
                    return QVariant(color);
                 }
     
                 return QVariant();
             }
     
          return QIdentityProxyModel::data(index, role);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    sqlModele->setQuery(*mRequete);
     
      monModele  *identModel = new monModele();
      identModel->setSourceModel(sqlModele);
     
                 identModel->data(
                          identModel->index(10,1),
                        Qt::ForegroundRole);
     
           ui->tableView->setModel(identModel);
     
           ui->tableView->show();

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Parce que pour les cellules autres que (6, 1), tu tombes…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
             if (role == Qt::ForegroundRole)
             {
     
                 if (row == 6 && col == 1)
                 {
                    QColor color(Qt::blue);
                    return QVariant (color);
                 }
                 return QVariant();   // <------- ICI
     
            }
    et n'exécutes pas le code qui suit et que tu espères.

    Sinon :
    Citation Envoyé par lacombe Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlModele->setQuery(*mRequete);
    mRequete ne devrait probablement pas être un pointeur.

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

Discussions similaires

  1. [XL-2016] Insérer une ligne avec fond en couleur
    Par retraite83 dans le forum Excel
    Réponses: 7
    Dernier message: 04/12/2018, 17h03
  2. Réponses: 2
    Dernier message: 19/01/2016, 19h37
  3. Changement couleur de fond d'une ligne avec FLEXGRID
    Par flophil78 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 25/01/2008, 19h22
  4. Réponses: 9
    Dernier message: 12/08/2002, 07h38
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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