dajaffe
dajaffe

Reputation: 855

Paint a QGraphicsItem to a QImage without needing a scene/view

So here's what I'm trying to do - Using a custom QGraphicsItem, I have my QPainter setup to paint into a QImage, which I then save to a file (or just keep the QImage in memory until I need it).

The issue I've found is that QGraphicsItem::paint() is only called if the QGraphcsItem belongs to a scene, the scene belongs to a view, AND the view and scene are not hidden.

Here's the code outside my project for testing purposes:

MyQGfx Class
void MyQGfx::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    qDebug() << "begin of paint function";
    QRectF rec = boundingRect();

    QImage image(boundingRect().size().toSize(),
                 QImage::Format_ARGB32_Premultiplied);
    image.fill(0);

    // construct a dedicated offline painter for this image
    QPainter imagePainter(&image);
    imagePainter.translate(-boundingRect().topLeft());

    // paint the item using imagePainter
    imagePainter.setPen(Qt::blue);
    imagePainter.setBrush(Qt::green);
    imagePainter.drawEllipse(-50, -50, 100, 100);

    imagePainter.end();


    if(image.save("C://plot.jpg"))
    {
        qDebug() << "written";
    }
    else {
        qDebug() << "not written";
    }
}

MainWindow Class
....
QGraphicsView* view = new QGraphicsView(this);
QGraphicsScene* scene = new QGraphicsScene(this);
view->setScene(scene);

MyQGfx* gfx = new MyQGfx();
scene->addItem(gfx);
gfx->update();
....

This all works fine, but I don't want a view/scene necessary, as it would be displayed on the mainwindow - is there any way around this?

Upvotes: 1

Views: 2393

Answers (1)

Luca Carlon
Luca Carlon

Reputation: 9976

Can't you just create a custom method accepting a QPainter, one painting on a QImage and one on your item?

Upvotes: 2

Related Questions