提问者:小点点

从服务器响应渲染SVG


我正在开发一个应用程序,该应用程序需要代表特定产品配置的SVG的服务器请求。这是我第一次处理SVG,我一直在解码服务器响应,以便可以使用QSvg渲染器显示图像。类似这样的东西

QByteArray panelData(QS.toStdString().c_str(), QS.length());
QSvgRenderer renderSVG(panelData);
QImage image(500, 200, QImage::Format_ARGB32);
QPainter painter(&image);
renderSVG.render(&painter);

我也想过像这样在qlabel路线上使用qPixmap。

QPixmap pix;
pix.fromImage(image);
ui->PixLabel->setPixmap(QPixmap::fromImage(image));

我尝试过使用QTextDocument::toHtml,正如其他人建议的那样,但最终只是用一组解码问题来交换其他问题。qt库有直接呈现下面响应的方法吗?

服务器回复部分…


共2个答案

匿名用户

假设QByteArray有效(svg xml描述符连贯完整,编码处理正确),这是有效的:

QString QS = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
             "<svg version=\"1.1\" viewBox=\"0 0 500 500\" width=\"500px\" height=\"500px\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">"
             "<title>Test</title>"
             "<rect x=\"100\" y=\"100\" width=\"100\" height=\"100\" stroke=\"blue\" fill=\"purple\" fill-opacity=\"0.5\" stroke-opacity=\"0.8\"/>"
             "</svg>";
QByteArray panelData(QS.toStdString().c_str(), QS.length());
QSvgRenderer renderSVG(panelData);
QImage image(500, 500, QImage::Format_ARGB32_Premultiplied);
QPainter painter(&image);
renderSVG.render(&painter);
bool res = image.save("D:\\HD\\Desktop\\svg.png");

匿名用户

经过考试数量,我发现问题源于编码。QSvgRender没有直接解码服务器响应的能力,这导致renderSVG. load()失败。我不得不使用QTextDocument的解码函数来解码resposne,以便QSvgRender可以读取它。

QString QS = QString::fromUtf8(serverReply.c_str());
QTextDocument text;
text.setHtml(QS);
QString plain = text.toPlainText();
QByteArray panelData(QByteArray::fromStdString(plain.toStdString()));

QSvgRenderer renderSVG;
renderSVG.load(panelData);
QPixmap pix(RenderSVG.defaultSize());
QPainter pixPainter(&pix);
renderSVG.render(&pixPainter);
ui->pixLabel->setPixmap(pix);