簡體   English   中英

從服務器響應中渲染 SVG

[英]Render SVG from server response

我正在開發一個應用程序,該應用程序需要對代表特定產品配置的 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 庫是否有直接呈現以下響應的方法?

部分服務器回復...

<?xml version="1.0" encoding="UTF-8" Standalone="no"?> <svg width="307px" height="625px" version="1.1" xmlns=" http://www.w3. org/2000/svg "> <defs> <linearGradient id="P-mlvr" x1="0%" y1="0%" x2="0%" y2="100%"> <stop offset="0 %" style="stop-color:#f0f0f0;stop-opacity:1;" /> <stop offset="0.0625" style="stop-color:#e0e0e0;stop-opacity:1;" /> <stop offset="100%" style="stop-color:#d0d0d0;stop-opacity:1;" /> </linearGradient> <linearGradient id="P-flvr" x1="0%" y1="100%" x2="0%" y2="0%"> <stop offset="0%" style= “停止顏色:#b0b0b0;停止不透明度:1;” /> <stop offset="0.0625" style="stop-color:#e0e0e0;stop-opacity:1;" /> <stop offset="75%" style="stop-color:#e0e0e0;stop-opacity:1;" /> <stop offset="100%" style="stop-color:#d0d0d0;stop-opacity: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");

經過多次測試,我發現問題源於編碼。 QSvgRenderer 無法直接解碼服務器響應,這導致 renderSVG.load() 失敗。 我不得不使用 QTextDocument 的解碼 function 以 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM