How does one paint the entire row's background in a QStyledItemDelegate ?

Posted by Casey Link on Stack Overflow See other posts from Stack Overflow or by Casey Link
Published on 2010-03-12T16:10:28Z Indexed on 2010/03/12 16:27 UTC
Read the original article Hit count: 513

Filed under:
|
|

I have a QTableView which I am setting a custom QStyledItemDelegate on.

In addition to the custom item painting, I want to style the row's background color for the selection/hovered states. The look I am going for is something like this KGet screenshot: KGet's Row Background

Here is my code:

void MyDelegate::paint( QPainter* painter, const QStyleOptionViewItem& opt, const    QModelIndex& index ) const
{
    QBrush backBrush;
    QColor foreColor;
    bool hover = false;
    if ( opt.state & QStyle::State_MouseOver )
    {
           backBrush = opt.palette.color( QPalette::Highlight ).light( 115 );
           foreColor = opt.palette.color( QPalette::HighlightedText );
           hover = true;
    }
    QStyleOptionViewItemV4 option(opt);
    initStyleOption(&option, index);
    painter->save();
    const QStyle *style = option.widget ? option.widget->style() : QApplication::style();
    const QWidget* widget = option.widget;
    if( hover )
    {
            option.backgroundBrush = backBrush;
    }
    painter->save();
    style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, widget);
    painter->restore();
    switch( index.column() )
    {
    case 0: // we want default behavior
        style->drawControl(QStyle::CE_ItemViewItem, &option, painter, widget);
        break;
    case 1:
    // some custom drawText
    break;
    case 2:
    // draw a QStyleOptionProgressBar
    break;
    }
    painter->restore();
}

The result is that each individual cell receives the mousedover background only when the mouse is over it, and not the entire row. It is hard to describe so here is a screenshot: The result of the above code

In that picture the mouse was over the left most cell, hence the highlighted background.. but I want the background to be drawn over the entire row.

How can I achieve this?

Edit: With some more thought I've realized that the QStyle::State_MouseOver state is only being passed for actual cell which the mouse is over, and when the paint method is called for the other cells in the row QStyle::State_MouseOver is not set.

So the question becomes is there a QStyle::State_MouseOver_Row state (answer: no), so how do I go about achieving that?

© Stack Overflow or respective owner

Related posts about c++

Related posts about qt