Ajout d'en-têtes verticales à un QTreeView
-
21-09-2019 - |
Question
J'ai une sous-classe de QTreeView
(et sous-classe QAbstractItemModel
) qui a une belle tête horizontale. Je voudrais ajouter des en-têtes verticaux (en descendant du côté gauche) pour correspondre. Mais contrairement à ce qui a QTableView
vertical séparé ( setVerticalHeader()
) et en-têtes horizontales ( setHorizontalHeader()
), QTreeView
permet seulement un en-tête unique ( setHeader()
).
Je sais que je peux juste faire semblant que la colonne gauche est l'en-tête et le rendre avec une couleur de fond différente (je ne ai pas besoin la possibilité de redimensionner ou réorganiser les lignes, donc je ne voudrais pas avoir à mettre en œuvre l'une des ces comportements spéciaux). Mais cela ne tient pas compte des styles locaux. Par exemple, sur mon système les en-têtes ont un léger gradient, en leur donnant un regard presque 3D.
Je suis donc à la recherche soit un moyen d'ajouter un en-tête verticale correcte (je suppose que ce serait une sous-classe de QHeaderView
) ou de rendre encore un en-tête en bas de la colonne de gauche, mais le rendu de la bonne façon.
La solution
Votre probablement raison que vous devez « faire semblant », mais vous devriez être en mesure de tirer à aussi bon que vos en-têtes horizontales.
Ce que vous devez faire est d'être responsable de la paintEvent
pour les cellules puis utiliser le style actuel pour dessiner un contrôle personnalisé. Quelque chose comme:
//QWidget* w is the widget who's style you want
QPainter painter(this);
QStyleOptionHeader opt;
opt.initFrom(this);
opt.state = QStyle::State_None;
opt.orientation = Qt::Vertical;
opt.state |= QStyle::State_Vertical;
if (w->isEnabled())
opt.state |= QStyle::State_Enabled;
opt.state |= QStyle::State_Active;
w->style()->drawControl(QStyle::CE_Header, &opt, &painter, w);
La meilleure façon d'être responsable d'un événement de peinture pour les cellules que vous souhaitez serait de créer un délégué d'élément personnalisé et réimplémenter la méthode virtual void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const = 0
. Vous venez porte votre peinture aux indices que vous aimez et passer le reste à la super classe (voir les docs de Qt pour cette classe).