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();
}

0

Решение

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]