2009-12-27 7 views
3

J'ai une sous-classe QTreeView (et une sous-classe QAbstractItemModel) qui a une belle en-tête horizontale. Je voudrais ajouter des en-têtes verticaux (en descendant du côté gauche) pour correspondre. Mais contrairement à QTableView qui a des en-têtes verticaux séparés (setVerticalHeader()) et horizontaux (setHorizontalHeader()), QTreeView n'autorise qu'un seul en-tête (setHeader()). Je sais que je peux juste prétendre que la colonne la plus à gauche est l'en-tête et la rendre avec une couleur d'arrière-plan différente (je n'ai pas besoin de pouvoir redimensionner ou réorganiser les lignes, donc je n'aurais pas à implémenter de ces comportements spéciaux). Mais cela ne prend pas en compte les styles locaux. Par exemple, sur mon système, les en-têtes ont un léger dégradé, ce qui leur donne un aspect presque 3D. Je cherche donc soit un moyen d'ajouter un en-tête vertical approprié (je devine qu'il s'agirait d'une sous-classe de QHeaderView) ou bien de rendre un en-tête dans la colonne la plus à gauche, mais en la rendant correcte.Ajout d'en-têtes verticaux à un QTreeView

Répondre

2

Vous avez probablement raison de dire que vous devrez "faire semblant", mais vous devriez être capable de dessiner pour être aussi beau que vos en-têtes horizontaux.

Ce que vous devez faire est de prendre en charge le paintEvent pour ces cellules et ensuite 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 faites juste passer votre tableau aux index qui vous intéressent et passez le reste à la super classe (voir les documents de Qt pour cette classe).

Questions connexes