Seite 1 von 1

QGraphicsScene: itemsBoundingRect zu weit

Verfasst: 30. Dezember 2009 14:51
von phlox81
Hallo,

ich habe ein Problem beim export einer QGraphicsScene als PNG.
Ich möchte nicht die gesamte Scene, sondern nur die Items als PNG.

Dies kann ich durch itemsBoundingRect auch erreichen, aber dieses Rechteck ist zu weit.
Habe als beispiel angefügt, welches ein einzelnes Item enthält, welches 50x50 px groß ist, das Bild sollte also Quadratisch sein.

Mein Code:

Code: Alles auswählen

void MainWindow::on_actionExport_PNG_triggered()
{
    QString file= QFileDialog::getSaveFileName(this,tr("export as png"));
    //QMessageBox::about(this,file,file);
    if(!file.endsWith(".png"))
        file = file + ".png";
    if(!file.isEmpty())
    {
        QPainter *pngPainter = new QPainter();
        QRectF rect = scene->itemsBoundingRect();
//create space around the items
        rect.setX(rect.x() - 20);
        rect.setY(rect.y() - 20);
        //rect.setWidth(rect.width() *0.7);
        rect.setHeight(rect.height() + 20);
        QRectF target = rect;
        target.setX(0);
        target.setY(0);
        QImage *image = new QImage(target.size().toSize(), QImage::Format_ARGB32);
        pngPainter->begin(image);
        scene->render(pngPainter,target,rect);
        pngPainter->end();
        image->save(file);
        delete pngPainter;
        delete image;
    }
}
Das Item leitet von QGraphicsEllipseItem ab, und setzt seine größe per setRect im Construktor.
Irgendwie habe ich das Gefühl das es auch mit den Maßen der Scene zu hat, diese ist hier 1000 x 500, was den seitenverhältnissen im Bild Entspricht, aber dies ist nicht immer so.

Muss ich evtl. boundingRect durch ein eigenes ersetzen?

phlox

Verfasst: 30. Dezember 2009 16:49
von upsala
Lass dir doch mal kurz bevor du target und rect verwendest, beide per qDebug() ausgeben...

Verfasst: 30. Dezember 2009 17:04
von phlox81
upsala hat geschrieben:Lass dir doch mal kurz bevor du target und rect verwendest, beide per qDebug() ausgeben...
Danke, das hat mir gezeigt, das das Target Rect nicht ganz korrekt erzeugt wird.
Wenn ich die Länge und Höhe seperat setze, klappts.