Qt下SVG格式图片应用

这篇具有很好参考价值的文章主要介绍了Qt下SVG格式图片应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SVG格式图片介绍

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

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

svg格式的图片是xml格式的,通过文本编译器打开xml文件,仔细观察看下svg格式文件的内容,一般情况下有圆形、矩形、线条、折线、多边形等形状上述这些形状可以自由的缩放,即图形跟随显示区域的大小进行变化,不会因为缩放导致图像不清晰,这才是我们理解的矢量图像,因为这些不是位图,而是通过指定坐标和和大小的方式来指定的;但是存在另外一个中情况,svg格式图片也可以插入位图,标签是<image id="xx" xlink:href="xxxxx">这个含义是在svg图中插入一个图片,该图片还是位图,即通过这种插入到svg格式中的图片原始分辨率为100*100,如果此时svg格式的图片放到一个500*500的区域中,该图片并不会产生svg可伸缩的效果,图片会模糊,因为原始图片像素不够,放到比原始图像宽的区域中进行显示的时候就会模糊,为了解决这个问题,原始图像的分辨率应该放大,一般情况下我们通过工具将一个png格式的图片转换为svg格式时,这种转换虽然是svg格式,但是整个svg文件并不具备自由缩放的效果,当要显示的区域超过png图片的原始分辨率时图像就会模糊。

矢量图参考链接:svg基础知识 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

Qt下SVG格式图片应用,Qt,qt

图1

Qt下SVG格式图片应用,Qt,qt

图2

svg格式图片代码demo

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

//首先要进行声明一个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格式图片范例

   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图像按照普通方式使用

    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博客文章来源地址https://www.toymoban.com/news/detail-698126.html

到了这里,关于Qt下SVG格式图片应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • qt加载obj格式的3D模型

    在 Qt 中加载 obj 格式的 3D 模型可以使用 Qt 3D 模块。 首先,你需要在你的工程文件中包含 Qt 3D 模块,方法是在工程文件的顶部添加以下行: 然后,在你的代码中包含 Qt 3D 的头文件: 接下来,你可以使用 Qt3DRender::QObjLoader 类来加载 obj 格式的 3D 模型。首先,创建一个 Qt3DRen

    2024年02月16日
    浏览(61)
  • QT--Opencv图片处理

    提示:本文为学习记录,若有疑问,请联系作者。 忙碌里寻宝藏。 opencv主要是对图像进行处理。 原型 Mat imread( const String filename, int flags ) 第一个参数 filename: 表示图像的路径。 第二个参数 flags:表示读取图像的方式。 filename 图片路径编译器里面接受 单斜杆/, 双斜杆//, 以

    2024年02月16日
    浏览(37)
  • Qt-背景图片

    在Qt中,使用QWidget或其子类(如QFrame、QPushButton等)的样式表(StyleSheet)来设置背景图片,并指定其位置。样式表允许以一种类似于CSS的方式来定义控件的外观和样式。 以下是在Qt中设置控件的背景图片并指定其位置的示例: 在示例中,创建了一个窗口和一个按钮,并使用

    2024年02月09日
    浏览(49)
  • 【Qt学习笔记】☞窗口插入图片

    零基础Qt实现简易音视频播放器(包括可能出现的问题+解决方法)-QT文档类资源-CSDN文库         上边链接是利用Qt实现的简易音视频播放器,在主窗口开始页面使用汉字描述播放器名称,为了更美观的展示播放器主页面,可以在播放器的开始页面插入图片。 Qt中没有Image组件

    2024年02月06日
    浏览(42)
  • Qt 保存成图片的方式

    如何保存成一个图片 Qt   提供了 QPixmap 类中提供了   save()  函数,共有两个重载版本 重载版本1  说明:使用指定的图像文件格式和质量因子将像素图保存到具有给定文件名的文件中。 成功则返回真; 否则返回假。 参数:          fileName : 要保存的文件名       

    2024年02月07日
    浏览(33)
  • QT图片浏览器制作

    一、Win7的自带查看器的效果 二、自己手工制作的效果 1、UI界面 2、效果界面 三、代码实现 1、头文件 2、主代码 (1)全局定义和预加载 (2)列表按钮:tool_button (3)切换图片 (4)自动播放和停播 (5)放大,缩小,图片旋转 总结: 传送门 1、利用控件实现文件打开,保

    2024年02月10日
    浏览(36)
  • QT:制作图片浏览器

    widget.h widget.cpp main.cpp widget.ui 结果

    2024年02月07日
    浏览(40)
  • 【QT开发(5)】0919-QT里面新增ui类,新增使用opencv读取图片的普通类,在ui类中显示图片

    1、Qt Creator快速入门_第三版__霍亚飞编著 2、《Qt+OpenCV显示图片(Mat转QImage然后显示在QLabel上)》 https://gitee.com/hiyanyx/qt5.14-cpp_-empty_-project/tree/Study2023-section5/ git分支“Study2023-section5” 新增ui类 新增使用opencv读取图片的普通类 为了更加方便,可在QT 中添加普通类,这样会自动生

    2024年02月07日
    浏览(41)
  • uniapp - 超详细实现播放 svg / svga 格式动画组件插件,用于直播间赠送礼物特效动画或项目动画特效较多的应用(新手小白保姆级教程,提供插件+详细运行示例+使用文档+注意事项+格式说明)

    网上关于 uniapp 播放 svg / svga 格式动画的教程很乱,基本上全是 BUG 和各种不兼容,很难复制过来自己用。 本文实现了 在 uniapp 项目中(完美兼容 H5 / App / 微信小程序平台),播放 svg / svga 格式动画功能的详细介绍, 您只需要使用我提供的 “组件源码及插件”,放到项目中去

    2023年04月24日
    浏览(190)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包