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

  1. #1
    Membre à l'essai
    Homme Profil pro
    employé
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Aveyron (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 14
    Points
    14
    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 éclairé 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 : 42
    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
    Points : 717
    Points
    717
    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.

    ++
    For crying out loud !

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

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 14
    Points
    14
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    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 à l'essai
    Homme Profil pro
    employé
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Aveyron (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 14
    Points
    14
    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.

  7. #7
    Membre à l'essai
    Homme Profil pro
    employé
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Aveyron (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 14
    Points
    14
    Par défaut Problème variable Index avec QIdentityProxyModel
    Merci, je comprends. En fait index.row() passe toutes les valeurs possible. Il choisi ensuite au moment du test if. Donc l'instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    identModel->data(
                          identModel->index(10,1),
                        Qt::BackgroundRole);
    ne sert à rien.
    Une question: Comment affecter une variable à row dans if(row == 6) à la place de 6.

    Une fois de plus, merci.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Oui, cette fonction membre est appelée pour chaque case et chaque role, et toi tu retournes ce que tu souhaites en fonction de ces entrées.

    Je ne suis pas sûr de comprendre correctement ta question. L'utilisation d'un membre y répondrait-il ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class TonModele : public QIdentityProxyModel {
        int coloredRow{6}; // ou fixée par le constructeur
        ...
    };
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (row == coloredRow && col == 1)
        ...
    Si tu vises plusieurs lignes, alors utilise un tableau et regarde si row est contenu dedans.

  9. #9
    Membre à l'essai
    Homme Profil pro
    employé
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Aveyron (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 14
    Points
    14
    Par défaut Problème variable Index avec QIdentityProxyModel
    Merci pour votre éclairage,

    Simplement ce que voulais savoir, comment fait on quand on est hors de la classe: class monModele : public QIdentityProxyModel, par exemple dans le main, pour indiquer le numéro de cellule ou de ligne.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par lacombe Voir le message
    Merci pour votre éclairage,

    Simplement ce que voulais savoir, comment fait on quand on est hors de la classe: class monModele : public QIdentityProxyModel, par exemple dans le main, pour indiquer le numéro de cellule ou de ligne.
    On n'a -- a priori -- absolument pas à s'en inquiéter : c'est le widget qui utilise le modèle qui s'occupera automatiquement de faire appel à la fonction data en fournissant les paramètres qui vont bien pour provoquer l'affichage adéquat (entre autres, lorsqu'il veut mettre l'affichage à jour).

    Tu peux -- éventuellement -- t'amuser "depuis n'importe quel endroit où le widget est accessible" à demander au widget de te fournir le modèle qu'il utilise sous une forme qui sera toujours très proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    auto * leModel = monWidget->model(); // C++11 inside: model est connu comme étant de type
                                         // QAbstractItemModel
    Et, à partir de là, tu peux, si tu le souhaites, invoquer toi-même la fonction data du modèle pour récupérer une information (quelconque, pour autant qu'elle corresponde à l'un des rôles prévus par la fonction data) concernant l'une des données affichée par le widget.

    Par exemple, si monWidget est un QTableView et qu'elle est composée de 10 lignes sur 5 colonnes, tu peux récupérer le texte qui se trouve dans la cellule (5,2) au travers d'un code proche de
    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
    /*Cette partie du code est détaillée à l'extrême, il est sûrement possible de la "compacter" très fortement */
    /* Je veux accéder à la cellule 5,2 de la vue,
     * je demande donc au modèle de me fournir le QModelIndex correspondant à la cellule indiquée
     */
    auto index = leModel->index(5,2); // C++11 inside : index est de type QModelIndex
    /* Maintenant que j'ai l'index de la cellule qui m'intéresse,
     * je peux demander les informations qui se rattachent à cette
     * cellule particuliere.
     * Par exemple, je peux demander les informations d'affichage (QDisplayRole,
     * ce qui est la valeur par défaut du deuxième paramètre attendu par la fontion
     * data() )
     */
    auto data = model->data(index); // C++11 inside : data est de type QVariant
    /* data est de type QVariant, ce qui permet de renoyer "n'importe quel type de donnée"
     * mais ce QVariant contient une chaine de caractères QString, vu que c'est ce qui est utilisé
     * pour l'affichage.  Je peux donc effectuer la conversion sous une forme proche de
     */
    auto string = data.toString(); //C++11 inside : string est de type QString
    /* string correspond exactement à la valeur du texte que l'on retrouve dans la cellule 5,2!!!
     * Mais, peut-être veux tu connaitre la couleur de fond de cette cellule?  Rien de plus simple:
     * le rôle qui t'intéresse ici est Qt::BackgroundRole
     */
    auto bgColor = leModel->data(index, Qt::BackgroundRole); //C++11 inside bgColor est de type QVariant 
    /* Idem que pour data Vs string : bgColor est de type QVariant, mais, en interne, il contient une donnée de type QColor
     * on peut donc récupérer la donnée d'origine
     */
    auto color = bgColor.toColor(); // c++inside color est de type QColor
    /* color correspond exactement à la couleur utilisée pour le fond de la cellule 5,2
    NOTA : A priori, si c'est juste pour t'amuser à récupérer la valeur en question uniquement dans l'espoir de l'afficher en mode debug, par exemple, cette technique n'a que très peu d'intérêt, vu que toutes les informations que tu pourras en tirer seront ... directement directement visibles au niveau du widget.

    Par contre, cela peut s'avérer intéressant si tu veux mettre en place une logique particulière en fonction des résultats que tu obtiens. Mais il faut toujours garder une chose très importante en tête : le widget ne fait que te fournir une représentation compréhensible de l'état de la donnée à un instant bien particulier du fonctionnement de ton application (la partie V(view) du modèle MVC / MVD)

    Si tu veux récupérer ces informations afin de pouvoir les modifier d'une manière ou d'une autre, tu dois travailler au niveau de la partie C (controleur) ou D (délégate) du modèle MVC / MVD
    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

  11. #11
    Membre à l'essai
    Homme Profil pro
    employé
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Aveyron (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 14
    Points
    14
    Par défaut Problème variable Index avec QIdentityProxyModel
    Merci beaucoup pour ces exemples, à présent je tente de changer de couleur une ligne à partir d'un clic sur un bouton. Je vais m'inspirer de votre aide.

    Merci encore.

+ 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