PDA

View Full Version : QHeaderView paintSection reimplementation



supergillis
24th November 2008, 17:24
I reimplemented QHeaderView so I could make it look more like my QTreeView.

I have got this code:

MusicListHeaderView::MusicListHeaderView(QWidget* parent): QHeaderView(Qt::Horizontal, parent)
{
hoverIndex = -1;
}

void MusicListHeaderView::paintSection(QPainter* painter, const QRect& rect, int logicalIndex) const
{
drawBackground(painter, rect, logicalIndex);
drawText(painter, rect, logicalIndex);
}

bool MusicListHeaderView::event(QEvent* event)
{
switch(event->type())
{
case QEvent::HoverEnter:
{
QHoverEvent* hover = static_cast<QHoverEvent*>(event);
int hoverIndex = logicalIndexAt(hover->pos());
}
break;
case QEvent::HoverLeave:
{
hoverIndex = -1;
}
break;
case QEvent::HoverMove:
{
QHoverEvent* hover = static_cast<QHoverEvent*>(event);
hoverIndex = logicalIndexAt(hover->pos());
}
break;
}
return QHeaderView::event(event);
}

void MusicListHeaderView::drawBackground(QPainter* painter, const QRect& rect, int index) const
{
if(hoverIndex == index)
painter->fillRect(rect, QColor(0xF0, 0xF0, 0xF0));
else
painter->fillRect(rect, Qt::white);
painter->setPen(QColor(0xF0, 0xF0, 0xF0));
painter->drawLine(rect.x(), rect.y()+rect.height()-1, rect.x()+rect.width(), rect.y()+rect.height()-1); // horizontal
// painter->drawLine(rect.x()+rect.width()-1, rect.y(), rect.x()+rect.width()-1, rect.y()+rect.height()); // vertical
}

void MusicListHeaderView::drawText(QPainter* painter, const QRect& rect, int index) const
{
QFontMetrics metric(painter->font());
QString final = "test";

painter->setPen(Qt::black);
painter->setFont(QFont("Corbel", 9, QFont::Bold));
painter->drawText(rect.adjusted(10, 0, 10, 0), Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine, final);
}

But now when I resize my column to the size where it gets smaller than the view, then the standard header is drawn (check attachment: upper right corner).

How can I fix this? Should I reimplement the whole paintevent?

Thanks in advance,
Gillis

aamer4yu
25th November 2008, 14:01
What are u setting the header view on ? is it a tableview ??
There can be some simpler way to do it...

supergillis
25th November 2008, 20:03
Yes there was indeed a simpler way to do it :). I made a custom style and reimplemented drawControl :)

aamer4yu
26th November 2008, 17:16
I guess it can be even simpler ,
from ur code i can make out the following - u need to subclass headerview so that u can underline it....
also u dont want that when u resize the column, a extra column shud appear.

May be you should look at QHeaderView::setStretchLastSection
bec as far as i understand, u want the tableview to behave as treeview... i had done somethng similar, so if u can explain, may be we can help