-
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();
-
@lacombe It is better to ask questions using French in this forum: https://forum.qt.io/category/57/french
This forum is English. -
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); }
-
@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();]
-
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. -
Quel est le but de cette variable ? De pouvoir paramétrer quelle cellule change de couleurs ?
-
-
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); }