Partage
  • Partager sur Facebook
  • Partager sur Twitter

Couleur de fond d'une cellule QTableView

Qt_QTableView_QSqlTableModel_C++

    17 juillet 2019 à 21:41:51

    Bonsoir.
    Mon souci ce soir est un souci populaire mais dont les reponses proposées ne s'appliquent pas à mon cas. En tout cas j'y arrive pas. J'ai un QTableView, alimenté par un QSqlTableModel, et je veux que certaines cellules aient un fond de couleur suivant ceertaines conditions. On m'a demandé de ré-implémenter la methode data() et je l'ai fait. Sauf que ca ne marche pas. voici l'implementation de la methode data(), suivi d'une capture d'ecran de mon tableau. Svp aidez moi

    QVariant Paiement::data(const QModelIndex &index, int role) const
    {
        int row = index.row();
        int col = index.column();
    
            switch(index.column()){
            case 4: //Column 1
                switch(role){
                case Qt::DisplayRole:
                     return QBrush(Qt::green);
                case Qt::BackgroundRole:
                    if(m_modele->data(m_modele->index(1, 4)) > 20000)
                        return QBrush(Qt::red);
                case Qt::ForegroundRole:
                    if(m_modele->data(m_modele->index(1, 4)) > 20000)
                        return QColor(Qt::black);
                }
             }
            return QVariant();
    
    }
    





    • Partager sur Facebook
    • Partager sur Twitter
      18 juillet 2019 à 13:01:16

      Bonjour,

      C'est la méthode data de quelle classe ? Parce qu'elle ne renvoie aucune donnée pour Qt::DisplayRole, donc ton tableau devrait être vide. 

      Comme tu ne changes la couleur que pour une vue, il faudrait:

      - soit réimplémenter la méthode data d'une classe dérivée de QIdentityProxyModel, à laquelle tu auras passé le modèle initial, et ne changer la valeur renvoyé que pour les roles des cases en question, toutes les autres doivent renvoyer la valeur initiale (return QIdentityProxyModel::data(index,role);),

      - soit passer par une classe déléguée dérivé de QItemDelegate/QStyledItemDelegate, juste pour la colonne (QTableView::setItemDelegateForColumn) et changer la couleur en réimplémentant la méthode QItemDelegate::paint pour changer le paramètre de style avant de rappeler la méthode initiale

      • Partager sur Facebook
      • Partager sur Twitter
        21 juillet 2019 à 23:25:00

        Bonsoir.

        En passant par ta première solution, j'arrive à mes fins.

        voici le header de ma classe.

        #include <QIdentityProxyModel>
        #include <QVariant>
        #include <QBrush>
        #include <QSqlQuery>
        #include <QWidget>
        #include <QDebug>
        #include <QString>
        class BackgroundProxyModel : public QIdentityProxyModel
        {
         public:
            BackgroundProxyModel(int mat, QObject *parent = NULL);
         
            QVariant data(const QModelIndex &index, int role) const override;
            int get_valeur_code();
        
            ~BackgroundProxyModel();
        
         private:
            int m_matricule, m_code;
        };

        Et voici son implémentation

        BackgroundProxyModel::BackgroundProxyModel(int mat, QObject *parent)
            : m_matricule(mat), QIdentityProxyModel(parent)
        {
            m_code = get_valeur_code();
        }
        
        int BackgroundProxyModel::get_valeur_code()
        {
            QString req_scolarite = " SELECT code FROM eleve "
                                    "WHERE code_elev = ?;";
            QSqlQuery user_scol;
            int valeur(0);
            user_scol.prepare(req_scolarite);
            user_scol.addBindValue(m_matricule);
            if(user_scol.exec())
            {
                if(user_scol.first())
                {
                    valeur = user_scol.value(0).toInt();
                    qDebug()<<"cest     bon";
        //deja ceci ne marche pas qDebug()<<req_code.lastError().text();
                }
            }
            else
                qDebug()<<"cest    pas    bon";
        
        
            return valeur;
        }
        
        QVariant BackgroundProxyModel::data(const QModelIndex &index, int role) const
        {
        
            if(m_code > 0)
            {
                if (index.row() == 0 && role == Qt::BackgroundRole)
                {
                    return QBrush(Qt::red);
                }
            }
            if (index.row() == m_code+1 && role == Qt::BackgroundRole)
            {
                return QBrush(Qt::red);
            }
            /*if (index.row() == 1 && role == Qt::BackgroundRole)
            {
                return QBrush(Qt::red);
            }
            if (index.row() == 2 && role == Qt::BackgroundRole)
            {
                return QBrush(Qt::red);
            }
            if (index.row() == 3 && role == Qt::BackgroundRole)
            {
                return QBrush(Qt::green);
            }
            if (index.row() == 4 && role == Qt::BackgroundRole)
            {
                return QBrush(Qt::green);
            }
            if (index.row() == 5 && role == Qt::BackgroundRole)
            {
                return QBrush(Qt::green);
            }*/
            return QIdentityProxyModel::data(index, role);
        
        }
        
        BackgroundProxyModel::~BackgroundProxyModel()
        {
        
        }
        

        Seulement la methode get_code() ne marche pas. En fait, voici ce que je veux:

        Dans ma classe BackgroundProxyModel, j'ai ajouté une méthode qui récupère une valeur contenue dans une autre table, et me sers de cette valeur comme condition pour modifier la couleur de fond d'une ligne(c'est plus intéressant de colorier toute la ligne). Cependant, ma méthode n'a pas l'air d'être exécutée. pour m'en rassurer, j'ai ajouter un qDebug() pour la requete SQl dans le cas où elle s'exécute et dans le cas où elle ne s'exécute pas. Mais je ne reçois aucun des deux messages. Du coup j'aimerai savoir pourquoi.
        en fait, j'ai ajouté un attribut au constructeur de cette classe. et cet attribut n'est rien d'autre que le matricule d'un eleve précis. Et ma méthode est là pour utiliser ce matricul pour interroger au moyen d'une requête SQL une table afin de recupérer une valeur que j'ai appelé m_code. et c'est cette valeur que je veux utiliser pour conditionner la coloration des lignes.



        -
        Edité par Gaël213 21 juillet 2019 à 23:27:35

        • Partager sur Facebook
        • Partager sur Twitter

        Couleur de fond d'une cellule QTableView

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown