Couleur avec QIdentityProxyModel



  • 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();
    

  • Qt Champions 2018

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


  • Lifetime Qt Champion

    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.



  • 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);
    
    
      }

  • Qt Champions 2018

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


  • Lifetime Qt Champion

    @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) {
    


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


  • Lifetime Qt Champion

    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.



  • 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.


  • Lifetime Qt Champion

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



  • 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;


  • Lifetime Qt Champion

    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);
    }
    


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


 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.