我的 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 有很好的渐变,而我的项目只有简单的颜色。
我想绘制我的项目以正确匹配标准小部件,但我不太清楚如何。我没有在选项中看到任何可以为我提供所需信息的内容。
编辑添加:请注意,这是一个有点玩具的例子。真正的代码除了一个字符串之外还有很多其他的东西,并且有一个适当的(和工作的)sizeHint 函数。这只是一个演示问题的玩具。