From 10:00 CET Friday 22nd November we will adjust how the server works to deal with some recently reported problems. Therefore there may be a load problem, if you experience more problems than usual trying to access the forum then please PM AndyS or any of the moderators so they can inform me.


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.


Log in to reply