Qt下SVG格式图片应用

SVG格式图片介绍

svg格式图片又称矢量图,该种格式的图片不同于png等格式的图片,采用的并不是位图的形式来组织图片,而是采用线条等组织图片,svg格式是图片的文件格式是xml,可以通过文件编译器打开查看svg格式内容。

svg格式的图片的特点是支持图片的放大和缩小,当图片放大和缩小时清晰度不会发生变化,相比于普通的png和jpg等格式的图片,当图片进行放大时就会产生拉伸效果或者不清楚的情况,对于svg格式的图片则存在这种情况。

但是有几点也需要注意:

  • 如果在放大和缩小时,要使图片不变形,最好显示控件的比例要与图片的比例保持一致,否则svg图片也会产生拉伸的效果,见图1
  • svg格式的图片在放大或者缩小时,首先要将svg图片渲染成对应大小的pixmap,如果qpixmap的大小与要赋值的图片大小布置,那么即使svg格式图片也不会填充满这个控件,例如一个qpushbutton的大小是size(900,900),如果创建pixmap时设置的大小为size(30,30),然后按钮调用setIcon设置按钮图标后,再次再次调用setIconSize设置图标大小为size(900,900),那么效按钮内的图标大小依然为size(30,30)。见图2

图1

图2

svg格式图片代码demo

使用svg格式图片作为QPushButton的图标

cpp 复制代码
//首先要进行声明一个QSvgRenderer变量
    QSvgRenderer render;
//加载svg格式图片
    render.load (QString("/home/consys/svgtest/image/xjdh.svg"));
    //获取svg格式图片的默认大小
    QSize size = render.defaultSize ();
    qDebug()<<"default size : "<<size;
    //声明一个图标,指定该图片的大小,这里有是有必要的,该size要与pushbutton的大小一致,否则
    //作为pushbutton的图标只有pximap的大小
    QPixmap *pix = new QPixmap(ui->pushButton->size());
    pix->fill (Qt::transparent); // 像素清空
    //渲染svg格式的图片到pixmap中
    QPainter painter(pix);
    painter.setRenderHints (QPainter::Antialiasing);
    render.render (&painter);

    //设置pushbutton的图标
    ui->pushButton->setIcon(QIcon(*pix));
    //设置图标的大小,该大小最好与pushbutton的大小一致,如果大小不一致,则会保持pixmap的比例进行
    //相应的缩小,例如pushbutton的大小为size(900,400),pixmap的size(900,400),设置iconsize
    //的大小为size(200,200),图标的形状是一个长方形,并不是一个正方形
    ui->pushButton->setIconSize(ui->pushButton->size());
    ui->pushButton->setFlat(false);

生成svg格式图片范例

cpp 复制代码
   QSvgGenerator generator;        // 定义SVG的产生器
    generator.setFileName (QString("temp.svg"));    // 设置SVG文件名
    generator.setDescription ("Test QSvgGenerator");    // 无所谓
    QSize size(400,400);
    generator.setSize (size);       // 设置大小
    generator.setViewBox(QRect(0, 0, 400, 400));  // 视口大小

    QPainter painter;               // 小画家
    painter.begin (&generator);
    QRect rect(0,0,400,400);
    painter.setBrush (Qt::cyan);
    painter.drawEllipse (rect);     // 直接在 generator 上绘制 一个圆
    painter.end ();                 // 需要保证绘制结束

上述代码运行完毕后,会在可执行程序目录下生成一个temp.svg格式的图片。

svg图像按照普通方式使用

cpp 复制代码
    QPixmap pixmap;
    //加载svg格式的图片
    pixmap.load(":/image/xjdh.svg");
    //设置图标
    ui->pushButton->setIcon(QIcon(pixmap));
    //设置图标大小
    ui->pushButton->setIconSize(ui->pushButton->size());

按照图片方式读svg图片进行使用,则相当于一张图片,并没有利用svg的特性,这种方式设置图标的后果是,图标不具备放大的作用,即svg的defaultsize有多大,那么该图片最大就多大,当button的大小大于svg的默认大小时,图标不能填满整个pushbutton。这里说明的是如要使svg图片本身是支持无失真的缩放图片,但是要生效过qt的控件中,必须要依赖于QSvgRenderer类将svg格式的图片渲染到不同的大小的pixmap中,这样才可以生效。

再次强调

我自己的理解是svg格式的图片支持进行放大和缩小,在这个过程中图片不会发生失真,但是svg图片本身并不能自适应去渲染图片,需要依托于qpixmap这样的媒介,假如需要渲染两个大小完全不同的按钮,每个按钮都需要一个对一个的pixmap设置成对应的大小,qpixmap利用QSvgRenderer类提供的接口render将svg格式的图片渲染到对应的pixmap上,从结果上看是QSvgRenderer利用svg图片渲染两个不同大小的pixmap。通过这两个不同大小pixmap去渲染qpushbutton控件,其它控件也类似的。

参考链接:Qt自定义控件----PushButton显示svg矢量图_qpushbutton svg_香油哥的博客-CSDN博客

相关推荐
尘中远12 小时前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
sycmancia14 小时前
Qt——多线程间的互斥
开发语言·qt
尘中远19 小时前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图
尘中远19 小时前
【Qwt 7.0 系列】交互功能详解 —— 平移、缩放、坐标轴交互与数据拾取
qt·数据可视化·绘图·qcustomplot·qwt·科学绘图
sycmancia19 小时前
Qt——进程与线程的概念
qt
郝学胜-神的一滴20 小时前
Qt 高级编程 034:深耕QWidget底层内核—彻底吃透无边框窗口设计核心原理
开发语言·c++·qt·程序人生·软件开发·用户界面
尘中远21 小时前
【Qwt 7.0 系列】3D 数据可视化 —— OpenGL 高性能三维绘图
qt·3d·qcustomplot·qwt·科学绘图·高性能绘图
满天星830357721 小时前
【Qt】控件(二) (geometry及与frameGeometry的区别)
开发语言·qt
大气的小蜜蜂21 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·qt·sqlite
尘中远21 小时前
【Qwt 7.0 系列】总体架构解析 —— 从单体到三库模块化的演进
qt·matplotlib·绘图·qwt·科学绘图