QStyledItemDelegate reimplementation: цвет элемента фона при наведении мыши

Моей первоначальной целью была подача элементов (QStandardItem) определенного столбца с расширенным текстом, поэтому я реализовал делегат подкласса, как было предложено.

Все выглядело хорошо, за исключением одного: когда я наводил указатель мыши на эти элементы, они вообще не выделялись. (Другие элементы в строке - где использовался оригинальный метод рисования - были выделены.) Хотя выбор элементов работал нормально. Затем я добавил строку

if ( optionV4.state & QStyle::State_MouseOver )

в котором я смог обработать выделение текста элемента, но я не знаю, как выделить фон. Это все еще белое. Есть идеи?

Вот соответствующий код:

class MStyledItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT

protected:
    void paint ( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const;
    QSize sizeHint ( const QStyleOptionViewItem& option, const QModelIndex& index ) const;
};

void MStyledItemDelegate::paint( QPainter* aPainter, const QStyleOptionViewItem& aOption, const QModelIndex& aIndex ) const
{

    // ...

    QStyleOptionViewItemV4 optionV4 = aOption;
    initStyleOption( &optionV4, aIndex );

    QStyle* style = optionV4.widget ? optionV4.widget->style() : QApplication::style();

    QTextDocument doc;
    doc.setHtml( optionV4.text );

    optionV4.text = QString();
    style->drawControl( QStyle::CE_ItemViewItem, &optionV4, aPainter );

    // highlight text
    QAbstractTextDocumentLayout::PaintContext ctx;
    if ( optionV4.state & QStyle::State_MouseOver )
    {
        ctx.palette.setColor( QPalette::Text, Qt::blue );
    }

    // draw
    aPainter->save();

    QRect textRect = style->subElementRect( QStyle::SE_ItemViewItemText, &optionV4 );
    aPainter->translate( textRect.topLeft() );
    aPainter->setClipRect( textRect.translated( - textRect.topLeft() ) );
    doc.documentLayout()->draw( aPainter, ctx );

    aPainter->restore();
}

1 ответ

Я полагаю, вы используете его с QTableView, вызовите метод setMouseTracking(true),

Другие вопросы по тегам