QSvgGenerator没有写入其outputDevice

时间:2017-12-15 02:06:49

标签: c++ qt qt5

我正在尝试将QSvgGenerator的输出转换为字符串,以便在HTML中使用。我可以使用.setFileName(...)方法并将输出作为文件输出,但.setOutputDevice(&qbuffer)不会向qbuffer添加任何内容(我可以使用qbuffer.write(...);将字符串写入缓冲区之前和之后在scene.render(&painter);上调用QSvgGenerator渲染操作,并看到这些字符串正在进入缓冲区。)

以下代码段很乐意写入文件,但不会给我一个SVG字符串,代码路径的唯一区别是一个使用.setFileName(...)而另一个使用.setOutputDevice(...)。< / p>

QGraphicsScene scene;
QPen backgroundPen(Qt::black);
QRectF backgroundRect(-10,-10,20,20);
QBrush backgroundBrush(QColor(128,64,64));
scene.addRect(backgroundRect, backgroundPen, backgroundBrush);

QBuffer qbuffer;
qbuffer.open(QBuffer::ReadWrite);

QSvgGenerator svgGenerator;

if (argc >= 2)
{
    svgGenerator.setFileName(argv[1]);
}
else
{
    svgGenerator.setOutputDevice(&qbuffer);
}
svgGenerator.setSize(QSize(128,128));
svgGenerator.setTitle("Title");
svgGenerator.setDescription("Description");

QPainter painter( &svgGenerator );
scene.render( &painter );

qbuffer.seek(0);
QString s(qbuffer.readAll());
qInfo() << s;

Qt 5.9,Ubuntu 17.10,如果重要的话。

1 个答案:

答案 0 :(得分:0)

根据documentation

  

bool QPainter :: end()

     

结束绘画。释放绘画时使用的任何资源。您   通常不需要调用它,因为析构函数会调用它。

     

如果画家不再活动,则返回true;否则返回   假的。

在你的情况下,你必须完成绘画:

[...]
QPainter painter( &svgGenerator );
scene.render( &painter );
painter.end();

qbuffer.seek(0);
QString s(qbuffer.readAll());
qInfo() << s;

输出:

"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<svg width=\"45.1556mm\" height=\"45.1556mm\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"  version=\"1.2\" baseProfile=\"tiny\">\n<title>Title</title>\n<desc>Description</desc>\n<defs>\n</defs>\n<g fill=\"none\" stroke=\"black\" stroke-width=\"1\" fill-rule=\"evenodd\" stroke-linecap=\"square\" stroke-linejoin=\"bevel\" >\n\n<g fill=\"none\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"1\" stroke-linecap=\"square\" stroke-linejoin=\"bevel\" transform=\"matrix(1,0,0,1,0,0)\"\nfont-family=\"Cantarell\" font-size=\"11\" font-weight=\"400\" font-style=\"normal\" \n>\n</g>\n\n<g fill=\"none\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"1\" stroke-linecap=\"square\" stroke-linejoin=\"bevel\" transform=\"matrix(6.09524,0,0,6.09524,64,64)\"\nfont-family=\"Cantarell\" font-size=\"11\" font-weight=\"400\" font-style=\"normal\" \n>\n</g>\n\n<g fill=\"#804040\" fill-opacity=\"1\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"1\" stroke-linecap=\"square\" stroke-linejoin=\"bevel\" transform=\"matrix(6.09524,0,0,6.09524,64,64)\"\nfont-family=\"Cantarell\" font-size=\"11\" font-weight=\"400\" font-style=\"normal\" \n>\n<rect x=\"-10\" y=\"-10\" width=\"20\" height=\"20\"/>\n</g>\n\n<g fill=\"none\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"1\" stroke-linecap=\"square\" stroke-linejoin=\"bevel\" transform=\"matrix(6.09524,0,0,6.09524,64,64)\"\nfont-family=\"Cantarell\" font-size=\"11\" font-weight=\"400\" font-style=\"normal\" \n>\n</g>\n\n<g fill=\"none\" stroke=\"#000000\" stroke-opacity=\"1\" stroke-width=\"1\" stroke-linecap=\"square\" stroke-linejoin=\"bevel\" transform=\"matrix(1,0,0,1,0,0)\"\nfont-family=\"Cantarell\" font-size=\"11\" font-weight=\"400\" font-style=\"normal\" \n>\n</g>\n</g>\n</svg>\n"