【发布时间】:2017-06-03 13:53:12
【问题描述】:
经过几个小时的工作,我可以在QListView 上绘制一个小部件。但是,这幅画是通过QPixmap 完成的。小部件出现,我可以看到一个进度条。但是,它有点“像素化”(由于使用了QPixmap)。是否可以直接绘制为普通小部件?这是我的问题。
以下是我的工作:
void FileQueueItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QPaintDevice* original_pdev_ptr = painter->device();
FileQueueListItem* itemWidget = reinterpret_cast<FileQueueListItem*>(index.data(Qt::UserRole).value<void*>());
itemWidget->setGeometry(option.rect);
painter->end();
QPixmap pixmap(itemWidget->size());
if (option.state & QStyle::State_Selected)
pixmap.fill(option.palette.highlight().color());
else
pixmap.fill(option.palette.background().color());
itemWidget->render(&pixmap,QPoint(),QRegion(),QWidget::RenderFlag::DrawChildren);
painter->begin(original_pdev_ptr);
painter->drawPixmap(option.rect, pixmap);
}
我通过here 的提示学会了如何做我所做的事情。在那里,绘画是直接在QListView 上完成的,这就是我想要实现的。以下尝试不起作用,我做错了什么:
void FileQueueItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
std::cout<<"Painting..."<<std::endl;
QPaintDevice* original_pdev_ptr = painter->device();
FileQueueListItem* itemWidget = reinterpret_cast<FileQueueListItem*>(index.data(Qt::UserRole).value<void*>());
itemWidget->setGeometry(option.rect);
painter->end();
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
else
painter->fillRect(option.rect, option.palette.background());
itemWidget->render(painter->device(),
QPoint(option.rect.x(), option.rect.y()),
QRegion(0, 0, option.rect.width(), option.rect.height()),
QWidget::RenderFlag::DrawChildren);
painter->begin(original_pdev_ptr);
}
列表仍然是空的,没有任何反应。虽然可以看到选择,但小部件不显示。
【问题讨论】:
-
如果将
painter->end();移动到itemWidget->render(...)之前的行会怎样? -
@putu 仍然可以看到选择,但看不到小部件。
-
您是否尝试过类似示例中的方法,例如Star Delegate Example?也许你错过了一些东西,例如
sizeHint。或者最好使用painter->save()和painter->restore()而不是begin, end。我无法提供更多建议,因为没有完整的代码。 -
@putu 另外 save() + restore() (在删除了所有 begin() 和 end() 之后)不起作用...相同的结果...选择有效,而渲染不起作用不行。
标签: c++ qt model-view-controller qt5 qitemdelegate