Angenommen, es gibt eine QGraphicsScene
oder QGraphicsView
, ist es möglich, eine Bilddatei zu erstellen (vorzugsweise PNG oder JPG)? Wenn ja, wie?
Antworten
Zu viele Anzeigen?
Petrucio
Punkte
5273
Nachdem dieses Problem gerade bearbeitet wurde, gibt es hier genug Verbesserung, um eine neue Antwort zu rechtfertigen:
scene->clearSelection(); // Auswahl aufheben
scene->setSceneRect(scene->itemsBoundingRect()); // Die Szene auf die begrenzenden Inhalte verkleinern
QImage image(scene->sceneRect().size().toSize(), QImage::Format_ARGB32); // Das Bild mit der exakten Größe der verkleinerten Szene erstellen
image.fill(Qt::transparent); // Alle Pixel transparent starten
QPainter painter(&image);
scene->render(&painter);
image.save("Dateiname.png");
Ich habe das nicht ausprobiert, aber das ist die Idee, wie man es machen kann.
Sie können dies auf verschiedene Arten tun. Eine Möglichkeit ist wie folgt:
QGraphicsView* view = new QGraphicsView(scene, this);
QString fileName = "file_name.png";
QPixmap pixMap = view->grab(view->sceneRect().toRect());
pixMap.save(fileName);
//Verwendet die QWidget::grab Funktion, um eine Pixkarte zu erstellen und zeichnet den QGraphicsView darin.
Die andere Möglichkeit ist die Verwendung der render Funktion QGraphicsScene::render():
QImage image(fn);
QPainter painter(&image);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
image.save("file_name.png")
amdev
Punkte
2602
GrabWidget ist veraltet, verwenden Sie grab. Und Sie können ein QFileDialog verwenden
QString fileName= QFileDialog::getSaveFileName(this, "Bild speichern", QCoreApplication::applicationDirPath(), "BMP-Dateien (*.bmp);;JPEG (*.JPEG);;PNG (*.png)" );
if (!fileName.isNull())
{
QPixmap pixMap = this->ui->graphicsView->grab();
pixMap.save(fileName);
}