經過數小時的工作,我可以在QListView
上繪製一個小部件。但是,這幅畫是通過QPixmap
完成的。小部件出現了,我可以看到一個進度條。但是,它有點「像素化」(由於使用了QPixmap
)。是否有可能直接作爲普通的小部件進行繪製?這是我的問題。直接在QListView上使用QStyledItemDelegate :: paint()繪製小部件()
下面是我做的:
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
@putu儘管如此,我仍然可以看到選擇,但看不到控件。 –
您是否嘗試過類似示例中的方法,如[Star Delegate Example](http://doc.qt.io/qt-5/qtwidgets-itemviews-stardelegate-example.html)?也許你會錯過一些東西'sizeHint'。或者,最好使用'painter-> save()'和'painter-> restore()'而不是'begin,end'。我無法提供更多建議,因爲完整的代碼不可用。 – putu