QList ウィジェット用の QStyledItemDelegate があります。
class MappingDisplayWidgetDelegate: public QStyledItemDelegate
{
Q_OBJECT
public:
MappingDisplayWidgetDelegate(QObject *parent=NULL);
virtual void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
virtual QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;
};
そして、ペイントメソッドは次のようになります:
void MappingDisplayWidgetDelegate::paint ( QPainter * painter,
const QStyleOptionViewItem & option,
const QModelIndex & index ) const
{
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
else if (option.state & QStyle::State_MouseOver)
painter->fillRect(option.rect, option.palette.midlight());
QFontMetrics fm(option.font);
QString filename = index.data(Qt::DisplayRole).toString();
QRect outline = option.rect;
int outmid = outline.center().y();
QRect fnBound = fm.boundingRect(filename);
int fnBoundMid = fnBound.center().y();
fnBound.moveLeft(outline.left());
fnBound.translate(0, outmid - fnBoundMid);
painter->drawText(fnBound, Qt::AlignVCenter | Qt::AlignLeft, filename);
}
これで動作しますが、State_Selected と State_MouseOver の処理では、既定のリストと同じ結果が得られません。上記のコードのスクリーン ショット (私は Win7 システムで実行しています) を左側に、標準の QListWidget を右側に示します。QListWidget には素敵なグラデーションがあることがわかりますが、私のアイテムには単純な色しかありません。
標準のウィジェットに適切に一致するようにアイテムをペイントしたいのですが、どうすればよいかわかりません。必要な情報を提供するオプションが何も表示されません。
追加するために編集: これはややおもちゃの例であることに注意してください。実際のコードには、1 つの文字列以外にもたくさんのものがあり、適切な (そして機能する) sizeHint 関数があります。これは、問題を示すための単なるおもちゃです。