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.

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top