QStyledItemDelegate重新实现:鼠标悬停时为项目背景着色

QStyledItemDelegate reimplementation: color item background when mouse over

本文关键字:悬停 项目 背景 鼠标 新实现 实现 QStyledItemDelegate      更新时间:2023-10-16

我最初的目标是为特定列的项(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();
}

我假设您将它与QTableView一起使用,调用方法setMouseTracking(true)