私の当初の目的は、特定の列の項目 (QStandardItem) にリッチ テキストをフィードすることでした。そのため、提案どおりにサブクラス デリゲートを実装しました。
1 つのことを除いて、すべて問題ないように見えました。これらの項目の上にマウス ポインターを移動すると、それらがまったく強調表示されませんでした。(元のペイント方法が使用されている行の他のアイテムが強調表示されました。)ただし、アイテムの選択は正常に機能しました。次に、行を追加しました
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();
}