Search code examples
qtqt5qtableviewqtreeviewqstyleditemdelegate

QStyledItemDelegate paint event on cell (not row) hover


I have a custom QStyledItemDelegate that paints a QPixmap in a particular column. When that cell is hovered over with the mouse, I would like to paint it differently.

Below is my paint event, which does paint the cell correctly when not State_MouseOver. However, it changes the color when I hover anywhere on the row. How can I make it change only when the mouse is hovering over the cell with the pixmap in it?

void myDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_ASSERT(index.isValid());

    switch(index.column()) {
        case DAY_COLUMN:
        {
            QSize btnSize = QSize(option.rect.height() * .9, option.rect.height() * .9);
            QRect r = option.rect;
            int x = r.right() - btnSize.width() - 10;
            int y = r.top();
            QRect btnRect = QRect(x, y, btnSize.width(), btnSize.height());

            QPixmap pixmap(":/icons/edit.png");

            // If hovered over, change color.
            if(option.state & QStyle::State_MouseOver) {
                auto mask = pixmap.createMaskFromColor(QColor("Black"), Qt::MaskOutColor);
                pixmap.fill(QColor("Red"));
                pixmap.setMask(mask);
            }

            painter->drawPixmap(btnRect, pixmap, pixmap.rect());

            return;
        }

        /*.... draw other column(s) as appropriate ...*/
    }

}

I'm using this delegate on all rows withing a QTreeView.
Qt 5.12


Solution

  • It can be because the selection behavior of the QTreeView is QAbstractItemView::SelectRows by default.
    You can change it using:

    m_tree_view.setSelectionBehavior(QAbstractItemView::SelectItems);
    

    See more:
    QAbstractItemView::SelectionBehavior
    QTreeView source code