我在实现在QListView
中自定义部件渲染时遇到了困难。
目前,我有一个以QAbstractListModel
为基础的自定义模型PlayQueue
在QListView
上显示。
这对于简单文本运作良好,但现在我想为每个元素显示一个自定义小部件。
因此,我继承了QStyledItemDelegate
并实现了paint
方法,代码如下:
void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
QWidget *widget = new QPushButton("bonjour");
widget->render(painter);
}
选择背景已正确地呈现,但未显示任何小部件。 我尝试了像Qt示例中那样使用简单的QPainter
命令,这很好用:
void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
if (option.state & QStyle::State_Selected)
painter->setPen(option.palette.highlightedText().color());
painter->setFont(QFont("Arial", 10));
painter->drawText(option.rect, Qt::AlignCenter, "Custom drawing");
}
所以我尝试了一些更改,例如:
- 将
QStyledItemDelegate
更改为QItemDelegate
- 在渲染周围添加
painter->save()
和painter->restore()
- 将小部件的几何形状设置为可用大小
但是我现在有些卡住了,我在互联网上搜寻了一段时间,但找不到任何做我想做的事情的例子,它们都谈论小部件的编辑(这要容易得多)或自定义绘制控件(预定义的控件,例如进度条)。但是这里我真的需要一个包含一些布局、标签和图片的自定义小部件。谢谢你的帮助!
我正在使用Qt 4.7.3为GCC在Ubuntu 11.04上。
painter->end();
之前,我创建了QPoint mappedorigin = painter->deviceTransform().map(QPoint(option.rect.x(), option.rect.y()))
,然后将mappedorigin作为第二个参数传递给QWidget::render()。如果我是在这个函数中创建widget,这可能不是必需的,但我将其创建为parent widget的一部分。 - Andrew Domaszek