Qt下SVG格式图片应用

news2025/1/13 7:29:23


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的图标

//首先要进行声明一个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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/981164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

halcon双目标定双相机标定

halcon双目标定 *取消更新 dev_update_off () *获取窗体句柄 dev_get_window (WindowHandle) *设置窗体字体样式 set_display_font (WindowHandle, 16, mono, true, false) *设置线条粗细 dev_set_line_width (3) *创建空对象 gen_empty_obj (ImageL) *读取指定文件内子集 li…

SpringMvc进阶

SpringMvc进阶 SpringMVC引言一、常用注解二、参数传递三、返回值 SpringMVC引言 在Web应用程序开发中&#xff0c;Spring MVC是一种常用的框架&#xff0c;它基于MVC&#xff08;Model-View-Controller&#xff09;模式&#xff0c;提供了一种结构化的方式来构建可维护和可扩…

python报错ModuleNotFoundError: No module named ‘XXX‘

记录一下改神经网络过程中遇到的小bug 在对网络结构进行更改时&#xff0c;不可避免要把别人的文件copy到自己的项目里。这时可能会遇到包导入的错误。正常情况下&#xff0c;导入的包应该大致包括三种方式&#xff1a; 1、导入外部包&#xff0c;如果这里错了就自己去pip ins…

Hadoop的第二个核心组件:MapReduce框架第四节

Hadoop的第二个核心组件&#xff1a;MapReduce框架 十、MapReduce的特殊应用场景1、使用MapReduce进行join操作2、使用MapReduce的计数器3、MapReduce做数据清洗 十一、MapReduce的工作流程&#xff1a;详细的工作流程第一步&#xff1a;提交MR作业资源第二步&#xff1a;运行M…

(二十三)大数据实战——Flume数据采集之采集数据聚合案例实战

前言 本节内容我们主要介绍一下Flume数据采集过程中&#xff0c;如何把多个数据采集点的数据聚合到一个地方供分析使用。我们使用hadoop101服务器采集nc数据&#xff0c;hadoop102采集文件数据&#xff0c;将hadoop101和hadoop102服务器采集的数据聚合到hadoop103服务器输出到…

【算法】选择排序

选择排序 选择排序代码实现代码优化 排序&#xff1a; 排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a; 假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&…

苍穹外卖 day12 Echats 营业台数据可视化整合

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现&#xff1a;工作台、数据导出 工作台效果图&#xff1a; 数据导出效果图&#xff1a; 在数据统计页面点击数据导出&#xff1a;生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原型 工作台是系…

GuLi商城-前端基础Vue-整合ElementUI快速开发

npm安装 启动项目&#xff1a;npm run dev http://localhost:8082/#/hello

强大易用的开源 建站工具Halo

特点 可插拔架构 Halo 采用可插拔架构&#xff0c;功能模块之间耦合度低、灵活性提高。支持用户按需安装、卸载插件&#xff0c;操作便捷。同时提供插件开发接口以确保较高扩展性和可维护性。 ☑ 支持在运行时安装和卸载插件 ☑ 更加方便地集成三方平台 ☑ 统一的可配置设置表…

Python UI自动化 —— 关键字+excel表格数据驱动

步骤&#xff1a; 1. 对selenium进行二次封装&#xff0c;创建关键字的库 2. 准备一个表格文件来写入所有测试用例步骤 3. 对表格内容进行读取&#xff0c;使用映射关系来对用例进行调用执行 4. 执行用例 1. 对selenium进行二次封装&#xff0c;创建关键字的库 from time imp…

RabbitMQ原理和界面操作

参考 ## 原理 https://zhuanlan.zhihu.com/p/344298279### https://blog.csdn.net/qq_53263107/article/details/127844208 界面操作 界面术语 Channels 通道的属性&#xff1a; channel&#xff1a;名称。 Virtual host&#xff1a;所属的虚拟主机。 User name&#xff1a…

机器人任务挖掘与智能超级自动化技术解析

本文为上海财经大学教授、安徽财经大学学术副校长何贤杰出席“会计科技Acctech应对不确定性挑战”高峰论坛时的演讲内容整理。何贤杰详细介绍了机器人任务挖掘与智能超级自动化技术的发展背景、关键技术和应用场景。 从本质来说&#xff0c;会计是非常适合智能化、自动化的。会…

【算法】堆排序 详解

堆排序 详解 堆排序代码实现 排序&#xff1a; 排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a; 假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c…

HarmonyOS实现静态与动态数据可视化图表

一. 样例介绍 本篇Codelab基于switch组件和chart组件&#xff0c;实现线形图、占比图、柱状图&#xff0c;并通过switch切换chart组件数据的动静态显示。要求实现以下功能&#xff1a; 实现静态数据可视化图表。打开开关&#xff0c;实现静态图切换为动态可视化图表 相关概念 s…

Hadoop的第二个核心组件:MapReduce框架第二节

Hadoop的第二个核心组件&#xff1a;MapReduce框架第二节 六、MapReduce的工作流程原理&#xff08;简单版本&#xff09;七、MapReduce中的序列化机制问题八、流量统计案例实现&#xff08;序列化机制的实现&#xff09; 六、MapReduce的工作流程原理&#xff08;简单版本&…

K8s(Kubernetes)学习(四):Controller 控制器:Deployment、StatefulSet、Daemonset、Job

什么是 Controller 以及作用常见的 Controller 控制器Controller 如何管理 PodDeployment 基本操作与应用通过控制器实现 Pod 升级回滚和弹性伸缩StatefulSet 基本操作与应用Daemonset 基本操作与应用Job 基本操作与应用Controller 无法解决问题 1 Controller 控制器 官网: h…

C语言类型占内存大小

C语言类型占内存大小 C语言数据类型sizeof测试基本数据类型所占字符大小运行结果数据模型 C语言数据类型 sizeof测试基本数据类型所占字符大小 #include <stdio.h>int main() {char a;short b;int c;long d;float e;double f;printf("char %d\n", sizeof (a…

Ubuntu18中NVIDIA,cuda,cudnn,pytorch安装

注意&#xff1a;nvidia驱动和cuda,cudnn,pytroch,python的对应关系 linux安装pytorch&#xff08;包括cuda与cudnn&#xff09;_linux清华园按照pytorch1.12_BryceRui的博客-CSDN博客 安装流程&#xff1a;安装cuda&#xff08;包括nvidia驱动&#xff09; cudnn python安装…

Excel VSTO开发7 -可视化界面开发

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 7 可视化界面开发 前面的代码都是基于插件启动或者退出时&#xff0c;以及Excel Application的相关事件&#xff0c;在用户实际操作…

java八股文面试[数据库]——写失效(双写缓冲区)

InnoDB的页和操作系统的页大小不一致&#xff0c;InnoDB页大小一般为16K&#xff0c;操作系统页大小为4K&#xff0c;InnoDB的页写入到磁盘时&#xff0c;一个页需要分4次写。 如果存储引擎正在写入页的数据到磁盘时发生了宕机&#xff0c;可能出现页只写了一部分的情况&#…