Search code examples
c++qtqt5qgraphicsitem

Qt - is there a way to transform a graphic item into a pixmap?


I want to create a pixmap from a graphicObject, so i can set the pixmap as an icon

I have a Block class derived from QGraphicsPathItem and i tried using:

Block *block = new Block();

QRect rect = block->boundingRect().toRect();

QPixmap pixmapItem;
pixmapItem.copy(rect);

QListWidgetItem *item = new QListWidgetItem;
item->setIcon(QPixmap(pixmapItem));

but the pixmap appears to be empty.

Is there a way to get an image/icon out of a graphicObject or graphicItem?


Solution

  • You have to use the paint() method of QGraphicsItem to get the rendering:

    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;
    }
    

    Example:

    #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();
    }
    

    enter image description here