To save what you paint in a Qt window to a file (SVG or image) is an easy and straightforward piece of code.
You create a QSvgGenerator or a QImage object.
Some initialization.
Paint into the object (treat it as an IODevice)
And we are done.
Suppose that this is what I draw in my paint event:
If I want to save it into an SVG file, it would be something like this
If I want to save it into an image file, it would be something like this.
Note that if you replace
References:
SVG Generator Example
Capture Qt widget as an image file
You create a QSvgGenerator or a QImage object.
Some initialization.
Paint into the object (treat it as an IODevice)
And we are done.
Suppose that this is what I draw in my paint event:
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter;
painter.begin(this);
painter.setRenderHint(QPainter::Antialiasing);
paint(painter);
painter.end();
}
void MainWindow::paint(QPainter &painter)
{
painter.setClipRect(QRect(0, 0, 200, 200));
painter.setPen(Qt::NoPen);
painter.fillRect(QRect(0, 0, 200, 200), Qt::gray);
painter.setPen(QPen(Qt::white, 4, Qt::DashLine));
painter.drawLine(QLine(0, 35, 200, 35));
painter.drawLine(QLine(0, 165, 200, 165));
}
If I want to save it into an SVG file, it would be something like this
void MainWindow::saveSvg()
{
QString path = QFileDialog::getSaveFileName(this, tr("Save as SVG"),"", tr("SVG file (*.svg)"));
if (path.isEmpty())
return;
QSvgGenerator generator;
generator.setFileName(path);
generator.setSize(QSize(200, 200));
generator.setViewBox(QRect(0, 0, 200, 200));
generator.setTitle(tr("SVG Generator Example Drawing"));
generator.setDescription(tr("An SVG drawing created by the SVG Generator "
"Example provided with Qt."));
QPainter painter;
painter.begin(&generator);
paint(painter);
painter.end();
}
If I want to save it into an image file, it would be something like this.
void MainWindow::savePng()
{
QString path = QFileDialog::getSaveFileName(this, tr("Save as image"), "", tr("PNG file (*.png)"));
if (path.isEmpty())
return;
QImage img(200, 200, QImage::Format_ARGB32);
QPainter painter;
painter.begin(&img);
paint(painter);
painter.end();
img.save(path);
}
Note that if you replace
QImage img(200, 200, QImage::Format_ARGB32); QPainter painter; painter.begin(&img); paint(painter); painter.end();with
QImage img(this->size(), QImage::Format_ARGB32); QPainter painter(&img); this->render(&painter);you'll be taking a screenshot of widget content into an image.
References:
SVG Generator Example
Capture Qt widget as an image file
Excelent post, thanks.
ReplyDelete