Adición de encabezados vertical a una QTreeView
-
21-09-2019 - |
Pregunta
Tengo una subclase QTreeView
(y subclase QAbstractItemModel
) que tiene una bonita cabecera horizontal. Me gustaría añadir cabeceras verticales (bajando por el lado izquierdo) para que coincida. Pero a diferencia de QTableView
que tiene separada vertical ( setVerticalHeader()
) y las cabeceras horizontales ( setHorizontalHeader()
), QTreeView
sólo permite una única cabecera ( setHeader()
).
Sé que solo puedo pretender que la columna más a la izquierda es la cabecera y lo hacen con un color de fondo diferente (no necesitar la capacidad de cambiar el tamaño o reorganizar las filas, por lo que no tendría que poner en práctica cualquiera de esos comportamientos especiales). Pero eso no toma en cuenta los estilos locales. Por ejemplo, en mi sistema las cabeceras tienen una ligera pendiente, dándoles un aspecto casi 3D.
Por tanto, estoy buscando ya sea una manera de añadir una cabecera vertical apropiada (que supongo que sería una subclase de QHeaderView
) o bien haciendo un encabezado de la columna más a la izquierda, pero haciéndolo de la manera correcta.
Solución
Su probablemente a la derecha que va a tener que "pretender", sino que debe ser capaz de dibujar a verse tan bien como los encabezados horizontales.
Lo que hay que hacer es estar a cargo de la paintEvent
de esas células y luego usar el estilo actual para dibujar un control personalizado. Algo así como:
//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 forma más fácil de estar a cargo de un evento de pintura para las celdas que desea sería la creación de un delegado de elemento personalizado y reimplementar el método virtual void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const = 0
. Usted acaba de puerta de su pintura a los índices que le interesan y pasar el resto de la superclase (ver documentación de Qt para esta clase).