前言:
首先簡單描述下SVG:
SVG 意為可縮放矢量圖形(Scalable Vector Graphics)。
SVG 使用 XML 格式定義圖像。
給界面或者按鈕上顯示一個圖標或背景圖片,日常使用.png格式的文件完全夠用,但是有些使用場景需要把圖片放大顯示時,使用.png文件就會開始模糊,這時需要加載.SVG文件,即使放大也很清晰。
1.使用.SVG和.PNG文件對比圖
左邊顯示的是svg格式的圖片,右邊顯示的是png格式的圖片,當放大到一定尺寸時,svg圖片依然很清晰, png圖片已經模糊了。
2.使用QLabel顯示.SVG矢量圖片
在界面添加一個QLabel控件,最終是要把.Svg圖片顯示到QLabel中的。
(1)使用QSvgRenderer加載矢量圖片.
(2)提供繪制設備,QPixmap對象;
(3)提供畫家,QPainter對象;并與繪制設備建立聯系;
(4)調用QSvgRenderer的render(painter)函數,讓畫家執行渲染操作!
(5)最后將繪制設備放到QLabel中。
需要加的頭文件:
#include "qsvgrenderer.h"
#include "qpainter.h"
代碼如下:
void BSDNClient::InitSvgWidget()
{QSvgRenderer* m_svgRender = new QSvgRenderer;m_svgRender->load(QString(":/image/Resource/image/csdn.svg"));QSize size = m_svgRender->defaultSize(); //獲取svg的大小QPixmap pix(size * 1.8); // 在這給繪圖設備重新設置大小pix.fill(Qt::transparent); // 像素清空,這一步必須有,否則背景有黑框QPainter painter(&pix); // 畫家和繪圖設備建立聯系painter.setRenderHints(QPainter::Antialiasing); //反鋸齒繪制m_svgRender->render(&painter); //執行渲染操作ui.m_pLabelSvg->setPixmap(pix); //將pix加載到QLabel上ui.m_pLabelSvg->setAlignment(Qt::AlignCenter); //設置居中顯示
}
根據以上代碼可以看出來,QSvgRenderer類用于將SVG文件的內容繪制到繪制設備上。
QSvgRenderer類的load()函數加載svg文件,需要將svg文件加載到資源文件中,QSvgRenderer類的defaultSize()函數可以獲取當前svg原本的大小,將這個大小乘以一個系數,給繪制設備,就能實現放大縮小顯示。
QPixmap對象的尺寸大小就是根據原有svg的尺寸進行放大1.8倍顯示;
pix.fill(Qt::transparent);這一步清空像素,如果不加的話,會導致背景變黑色;
QPainter painter(&pix); 定義畫家QPainter對象,將繪圖設備pix的地址作為參數傳進去。
m_svgRender->render(&painter);執行渲染操作;
ui.m_pLabelSvg->setPixmap(pix); //將pix加載到QLabel上
注意:
因為用到了Svg模塊,需要給項目配置加上svg模塊,我用的vs2019+Qt,配置如下圖:
3.總結
本文只是將一個svg矢量圖片顯示在了一個QLabel控件上,只是最簡單的功能,只是QtSvg模塊中的一個使用方法,該模塊還有其它方式可以實現對Svg更復雜的操作,等之后有機會接觸到了在做總結記錄!