【问题标题】:Render SVG from server response从服务器响应渲染 SVG
【发布时间】:2021-07-02 11:19:15
【问题描述】:

我正在开发一个应用程序,该应用程序需要服务器请求代表特定产品配置的 SVG。这是我第一次处理 SVG,我很想用 QSvgRenderer 显示图像的方式来解码服务器响应。像这样的

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 库是否有直接的方式来呈现下面的响应?

部分服务器回复...

http://www.w3.org/2000/svg">

  • 您显示的字符串是一个普通的 svg 描述符,如果您设法在QS 中正确提取它,您的第一个代码 sn-p 似乎是合法的:什么不起作用?
  • 我尝试的第一件事是将上述响应直接输入 SVG 渲染器,我得到的只是一张空白图像。可能提取到 QByteArray 是不正确的。
  • 我已经尝试了许多 RenderSVG.load(panelData) 的变体来改变 panelData 的解码。全部返回 false。
  • 只是看看是不是编码有问题,能不能把QByteArray里面的svg(<xml ...<svg...</svg>部分),保存到文件ex. test.svg 并使用 svg 查看器(例如浏览器)打开它以检查它是否有效?
  • 服务器回复看起来不完整,或者您正在粘贴其中的一部分。将回复保存到文件并将其附加到您的问题中。您可能想使用.svg 扩展名保存它并尝试先用浏览器打开它

标签: html c++ xml qt svg


【解决方案1】:

假设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");

【讨论】:

    【解决方案2】:

    经过多次测试,我发现问题源于编码。 QSvgRenderer 无法直接解码服务器响应,这导致 renderSVG.load() 失败。我必须使用 QTextDocument 的解码功能以 QSvgRenderer 可以读取的方式解码响应。

    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);
    

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 1970-01-01
      • 2020-01-22
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多