Quelle est la meilleure façon de faire les cellules QTableView ont et vers le bas bouton poussé états dans Qt?

StackOverflow https://stackoverflow.com/questions/970618

Question

Je suis en train de faire les cellules d'un QTableView ressemblent à des boutons cliquables 3D. Alors que lorsque vous cliquez sur une cellule, le regard du bouton poussé. Tout le monde semble penser que je veux simplement changer la couleur, je dois montrer des images d'un bouton normal, et un bouton poussé, qui ont l'air en 3 dimensions.

Je l'ai fait déjà d'appeler QTableView::setItemDelegate(), avec un ItemDelegate approprié qui va changer l'arrière-plan de la cellule quand on clique dessus. Cependant, je suis bloqué à ce stade parce que je veux des cellules à différentes touches de couleur à partir des données qu'ils contiennent. Ainsi, une cellule avec un faible nombre serait un bouton rouge, qui est également rouge quand on clique dessus, et les autres cellules seraient différentes couleurs.

Je peux définir la couleur du bouton avec le TableModel, mais une fois que le bouton est cliqué, il n'y a aucun moyen pour le ItemDelegate de savoir qu'il est censé être une couleur différente que le reste. Comment relier les deux de sorte que le ItemDelegate sait de quelle couleur il est censé être?

En outre, il est tout simplement une meilleure façon de faire des cellules ressemblent à des boutons?

Était-ce utile?

La solution

Vous pouvez appeler QModelIndex::model() à partir de la méthode de ItemDelegate du paint(), car il a un paramètre de QModelIndex. Cela vous donne la TableModel pour les données que vous pouvez programatically Décidez de la couleur du bouton de la cellule sera.

Cependant, cela est encore pas aussi élégant que je l'espère. Est-ce que quelqu'un sait une meilleure façon de changer l'apparence des cellules de table quand à la fois le haut et vers le bas états-poussoirs bouton?

Autres conseils

Pourquoi ne pas demander l'index de la couleur de fond.

Quelque chose comme ça ...

QStyleOptionToolButton buttonOption;
const QStyleOptionViewItemV4& optionV4 = dynamic_cast<QStyleOptionViewItemV4&>(option);
//...
buttonOption.palette.setBrush( QPalette::Button, index.data( Qt::BackgroundColorRole ) ); 
//...

J'ai le sentiment que son un bogue dans Qt et son doit avoir été ...

// model code  
if(role==Qt::BackgroundColorRole )
    return qvariant_cast<QBrush>( QBrush(Qt::red) );

// delegate code 
buttonOption.palette.setBrush(QPalette::Button, optionV4.backgroundBrush );

Parce que le optionV4.backgroundBrush est correct dans la méthode sizeHint mais est invalide dans la méthode paint. Je vois la raison pour laquelle sizeHint devrait avoir la brosse d'arrière-plan et la méthode paint pas. Je vais le signaler à Nokia.

EDIT:
On dirait que j'avais raison et son un bogue dans QStyleOptionViewItemV4 ne copie pas l'icône et backgroundBrush

Pouvez-vous pas le nombre ID / ligne de la ligne de la cellule de table, puis vérifiez contre la table de couleurs que vous pouvez avoir, et définir la couleur en conséquence? Je ne sais pas si je comprends bien ou pas votre question.

Attribuer un rôle de données pour la couleur de fond, et votre délégué de l'élément, demandez à l'index de modèle ce que sa couleur de fond est (en utilisant data( bg_color_role ) ou quelque chose de similaire). Ensuite, dans votre modèle, vous devez vous assurer que la fonction de données retourne une couleur pour le bg_color_role qui est approprié pour les données modélisées.

La façon de le faire est d'utiliser la méthode de données de l'objet QModelIndex vous obtenez sur la méthode de peinture, et demander un rôle spécifique (si vous définissez un modèle personnalisé, vous pouvez ajouter vos propres rôles et donner les informations vous devez le délégué dans ces rôles.)

TIMW, je pense que vous devez remplir les informations QStyleOptionViewItemV4 en appelant initStyleOption avant.

Je ne sais pas où l'exigence d'une image de fond vient. Si vous voulez que les cellules ressemblent QPushButtons, vous devriez probablement hériter de QItemDelegate et mettre en œuvre paint() à utiliser QStyle pour vous dessiner un QPushButton, quelque chose comme ceci:

QStyleOptionButton opt;
// fill 'opt' from the information from the model, and the style option that's passed in
style()->drawControl( QStyle::CE_PushButton, &opt, painter );

Avez-vous essayé d'utiliser des feuilles de style personnalisées?

Vous pouvez simplement appliquer la même feuille de style pour chaque cellule, puis changer l'image d'arrière-plan / de style pour dessiner les images de bouton 3D selon

si oui ou non il est sélectionné.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top