Вы должны использовать paint()
метод QGraphicsItem
, чтобы получить рендеринг:
static QPixmap QPixmapFromItem(QGraphicsItem *item){
QPixmap pixmap(item->boundingRect().size().toSize());
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
QStyleOptionGraphicsItem opt;
item->paint(&painter, &opt);
return pixmap;
}
Пример:
#include <QApplication>
#include <QGraphicsPathItem>
#include <QGraphicsView>
#include <QHBoxLayout>
#include <QListWidget>
static QPixmap QPixmapFromItem(QGraphicsItem *item){
QPixmap pixmap(item->boundingRect().size().toSize());
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
QStyleOptionGraphicsItem opt;
item->paint(&painter, &opt);
return pixmap;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
QHBoxLayout lay(&w);
QListWidget listWidget;
QGraphicsView view;
QGraphicsScene scene;
view.setScene(&scene);
int counter = 0;
for(const QColor & color : {QColor("red"), QColor("blue"), QColor("green")}){
QPainterPath p;
p.addRoundedRect(0, 0, 150, 50, 2, 2);
QGraphicsPathItem *block = scene.addPath(p);
block->setBrush(QBrush(color));
block->setFlag(QGraphicsItem::ItemIsMovable);
block->setFlag(QGraphicsItem::ItemIsSelectable);
block->setPos(counter*QPointF(10, 10));
// get QPixmap from item
QPixmap pixmap = QPixmapFromItem(block);
QListWidgetItem *l_item = new QListWidgetItem(color.name());
listWidget.addItem(l_item);
l_item->setIcon(QIcon(pixmap));
counter++;
}
lay.addWidget(&listWidget);
lay.addWidget(&view);
w.show();
return a.exec();
}