Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. French
  4. Couleur avec QIdentityProxyModel
Forum Updated to NodeBB v4.3 + New Features

Couleur avec QIdentityProxyModel

Scheduled Pinned Locked Moved Unsolved French
pistache
13 Posts 4 Posters 2.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L lacombe

    Bonjour,

    Voici le code pour appliquer une couleur à une cellule, mais ne marche pas. pouvez vous me le corriger ?

    Merci d'avance.

    
    class monModele : public QIdentityProxyModel
    {
     
    public:
     
        monModele(QObject* parent = 0): QIdentityProxyModel(parent)
             
     
        QVariant data(const QModelIndex &index, int role)
           {
           if (role == Qt::BackgroundRole) {
               QColor color = Qt::blue;
                     return QBrush(color);
            }
           return QIdentityProxyModel::data(index, role);
     
           }
    
    
    
    
    ..........
    sqlModele=newQSqlTableModel();
    sqlModele->setQuery(*mRequete);
    monModele*identModel=newmonModele();
    identModel->setSourceModel(sqlModele);
                  identModel->data(
    identModel->index(2,1),
    Qt::BackgroundRole);
    ui->tableView->setModel(identModel);
    ui->tableView->show();
    
    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #2

    @lacombe It is better to ask questions using French in this forum: https://forum.qt.io/category/57/french
    This forum is English.

    https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #3

      Bonjour,

      Comme déjà dit sur l'autre question, il faut rajouter une condition dans le if (role == Qt::BackgroundRole) { qui vérifie la ligne et la colonne d'index et ne retourne la couleur que pour les bonnes valeurs.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • L Offline
        L Offline
        lacombe
        wrote on last edited by
        #4

        Merci de votre réponse, j'ai essayé d'apporter les correction, mais le message d'erreur à la compilation au niveau du if...
        Merc i de votre aide.

        class monModele : public QIdentityProxyModel
        {

        public:

        monModele(QObject* parent = 0): QIdentityProxyModel(parent)
            { qDebug() << "constructor"; }
        
        QVariant data(const QModelIndex &index, int role) const override
           {
             if (role == Qt::ForegroundRole) && (index == index.row()) && (index == index.column()) {
        
             return QVariant(QBrush (QColor(Qt::blue)));
        
            }
        
        
          return QIdentityProxyModel::data(index, role);
        
        
          }
        
        1 Reply Last reply
        0
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by
          #5

          Est ce que tu voudrais appliquer une couleur à une cellule avec une coordonner fixe?

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by VRonin
            #6

            @lacombe said in Couleur avec QIdentityProxyModel:

            if (role == Qt::ForegroundRole) && (index == index.row()) && (index == index.column()) {

            Vue que la cellule souhaitée est la 2, 1:

            if (role == Qt::ForegroundRole
                && index.row() == 2
                && index.column() == 1) {
            

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply
            0
            • L Offline
              L Offline
              lacombe
              wrote on last edited by
              #7

              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 en (10,1) la coloration est toujours en (6,1) comme dans le code suivant:

              Merci d'avance.

              [ 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);]

              ...........

              [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();]

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #8

                Simplifions un peu les choses:

                QVariant data(const QModelIndex &index, int role) const override
                {
                    if (role == Qt::ForegroundRole) {
                        if (row == 6 && col == 1) {
                            return QColor(Qt::blue);
                        } else if (row == 8 && col == 1) {
                            return QColor(Qt::red);
                        }
                    }
                    return QIdentityProxyModel::data(index, role);
                }
                

                Cela rend le code plus claire et plus lisible.

                Ensuite:

                identModel->data(
                identModel->index(10,1),
                Qt::ForegroundRole);

                Ceci ne sert strictement à rien ou alors il manque qDebug() << devant pour voire ce que retourne la méthode.

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                1 Reply Last reply
                2
                • L Offline
                  L Offline
                  lacombe
                  wrote on last edited by
                  #9

                  Merci, Ceci est plus clair.
                  Autre chose: comment peut on paramétrer une variable à la place de 6 dans par exemple if(row==6) ?

                  Merci une fois de plus de votre aide.

                  1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #10

                    Quel est le but de cette variable ? De pouvoir paramétrer quelle cellule change de couleurs ?

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    0
                    • L Offline
                      L Offline
                      lacombe
                      wrote on last edited by
                      #11

                      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.

                      Merci d'avance;

                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #12

                        Il vous faut rajouter une méthode permettant de configurer ça.
                        Code permettant de faire ça avec plusieurs cellule (attention uniquement de tête donc ni compilé, ni testé):

                        void setBackgroundColor(int row, int column, const QColor& color) {
                            QPair<int, int> cell = qMakePair(row, column)
                            _cellColorMap[cell] = color;
                        }
                        

                        _cellColorMap étant QMap<QPair<int,int>, QColor>

                        Comme cela dans data:

                        QVariant data(const QModelIndex &index, int role) const override
                        {
                            if (role == Qt::ForegroundRole) {
                                QPair<int, int> cell = qMakePair(index.row, index.column);
                                auto iterator = _cellColorMap.find(cell);
                                if (iterator != _cellColorMap.end()) {
                                    return *iterator;
                                }
                            }
                            return QIdentityProxyModel::data(index, role);
                        }
                        

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        1 Reply Last reply
                        0
                        • L Offline
                          L Offline
                          lacombe
                          wrote on last edited by
                          #13

                          Merci de votre réponse, à présent il me faut comprendre.

                          1 Reply Last reply
                          0

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved