Qt5开发从入门到精通——第六篇四节( 图像与图片——显示SVG格式图片 )

news/2023/10/4 1:20:45

欢迎小伙伴的点评✨✨,相互学习、互关必回、全天在线🍳🍳🍳
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀

文章目录

  • 前言
  • 一、SVG格式图片概述
  • 二、效果实例
    • 2.1、svg图片原码
  • 三、原码解析
    • mainwindow.h
    • svgwidget.h
    • svgwindow.h
    • main.cpp
    • mainwindow.cpp
    • svgwidget.cpp
    • svgwindow.cpp
  • 四、总结


前言

本章首先介绍几种主要位置函数及其之间的区别,以及各种与位置相关函数的使用场合;然后,通过一个简单绘图工具实例,介绍利用 QPainter 和 QPainterPath 两种方法绘制各种基础图形。


一、SVG格式图片概述

SVG 的英文全称是 Scalable Vector Graphics, 即可缩放的矢量图形。它是由万维网联盟
(World Wide Web Consortium, W3C) 在 2000 年 8 月制定的一种新的二维矢量图形格式,也是
规范中的网格矢量图形标准,是一个开放的图形标准。
SVG 格式的特点如下。
(1) 基于XML
(2) 采用文本来描述对象。
(3) 具有交互性和动态性。
(4) 完全支待 DOM 。
SVG 相对千 GIF 、 JPEG 格式的优势是, SVG 是一种矢量图形格式,比 GIF 、 JPEG 等栅格格式具有众多优势,如文件小,对千网络而言,下载速度快;可任意缩放而不会破坏图像的清晰度和细节;图像中的文字独立千图像,文字保留可编辑和可搜寻的状态,也没有字体限制,用户系统即使没有安装某一种字体,也可看到与制作时完全相同的画面等。正是基千其格式的各种优点及开放性, SVG 得到了众多组织和知名厂商的支持与认可,因此能够迅速地开发和推广应用。
Qt 为 SVG 格式图片的显示与生成提供了专门的 QtSvg 模块,此模块中包含了与 SVG 图片相关的所有类,主要有 QSvgWidget、 QSvgRender 和 QGraphicsSvgltem 。

二、效果实例

图一
在这里插入图片描述

2.1、svg图片原码

<svg width='200' height='200' xmlns='http://wwww.w3.org/2000/svg'><!--平等四边形--><polygon points='15,10 55,10 45,20 5,20'style='fill:red; stroke: black;'/><!--五角星--><polygon points='35,37.5 37.9,46.1 46.9,46.1 39.7,51.542.3,60.1 35,55 27.7,60.1 30.3,51.5 23.1,46.1 32.1,46.1'style='fill: #ccffcc; stroke: green;'/><!--不规则图形--><polygon points='60 60, 65,72 80 60, 120,120 72,85 50,95'style="fill: yellow; fill-opacity:.5; stroke:black"/>
</svg>

将代码拷贝到文本当中,把后缀名改为xxx.svg

三、原码解析

在完成此功能的程序中使用与 SVG 相关的类,必须在程序中包含 SVG 相关的头文件:

#include <QtSvg>

由于 Qt 默认生成的 Makefile 中只加入了 QtGui 、 QtCore 模块的库,所以必须在工程文件".pro" 中加一行代码:

QT+= svg

这样才可在编译时加入 QtSvg 的库。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "svgwindow.h"
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = 0);~MainWindow();void createMenu ();public slots:void slotOpenFile();private:SvgWindow *svgWindow;     //用千调用相关函数传递选择的文件名
};#endif // MAINWINDOW_H

svgwidget.h

#ifndef SVGWIDGET_H
#define SVGWIDGET_H#include <QtSvg>
#include <QSvgWidget>
#include <QSvgRenderer>
class SvgWidget : public QSvgWidget
{Q_OBJECT
public:SvgWidget(QWidget *parent=0);void wheelEvent(QWheelEvent *);///响应鼠标的滚轮事件,使 SVG 图片能够通过鼠标滚轮的滚动进行缩放private:
QSvgRenderer *render;          //用于图片显示尺寸的确定
};#endif // SVGWIDGET_H

svgwindow.h

#ifndef SVGWINDOW_H
#define SVGWINDOW_H
#include <QScrollArea>
#include "svgwidget.h"class SvgWindow : public QScrollArea
{
public:SvgWindow(QWidget *parent=0);void setFile (QString) ;void mousePressEvent(QMouseEvent *);void mouseMoveEvent(QMouseEvent *);
private:
SvgWidget *svgWidget;
QPoint mousePressPos;
QPoint scrollBarValuesOnMousePress;
};#endif // SVGWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent)  //在 MainWindow 构造函数中,创建一个 SvgWindow 对象作为主窗口的中央窗体。: QMainWindow(parent)
{setWindowTitle(tr("SVG Viewer"));createMenu();svgWindow =new SvgWindow;setCentralWidget(svgWindow);
}MainWindow::~MainWindow()
{}
void MainWindow::createMenu()   //创建菜单栏
{QMenu *fileMenu =menuBar ()->addMenu (tr(" 文件")) ;QAction *openAct =new QAction(tr(" 打开 "),this);connect(openAct,SIGNAL(triggered()),this,SLOT(slotOpenFile()));fileMenu->addAction(openAct);
}void MainWindow:: slotOpenFile ()  //通过标准文件对话框选择 SVG 文件,并调用 SvgWindow 的 setFile()函数将选择的文件名传递给 svgWindow 进行显示
{QString name =QFileDialog::getOpenFileName(this,"打开 ","/","svg files(*.svg)");svgWindow->setFile(name);
}

svgwidget.cpp

#include "svgwidget.h"SvgWidget::SvgWidget(QWidget *parent) :QSvgWidget(parent)  // SvgWidget 构造函数获得本窗体的 QSvgRenderer 对象
{render = renderer();
}void SvgWidget::wheelEvent(QWheelEvent *e)  //鼠标滚轮的响应事件,使 SVG 图片能够通过鼠标滚轮的滚动进行缩放。
{const double diff=0.1;QSize size =render->defaultSize ();int width =size. width();int height =size.height();if (e->delta () >0){///对图片的长、宽值进行处理,放大一定的比例width =int (this->width() +this->width() *diff);height =int (this->height () +this->height () *diff);}else{//对图片的长、宽值进行处理,缩小一定的比例width =int(this->width()-this->width()*diff);height =int (this->height () -this->height () *diff);}resize(width,height);   //利用新的长、宽值对图片进行 resize ()操作
}

svgwindow.cpp

#include "svgwindow.h"
//SvgWindow 类的构造函数,构造 SvgWidget 对象,并调用 QScrollArea 类的 setWidget()函数设置滚动区的窗体,使 svgWidget 成为 SvgWindow 的子窗口。
SvgWindow::SvgWindow(QWidget *parent) :QScrollArea(parent)
{svgWidget =new SvgWidget;setWidget(svgWidget);
}
void SvgWindow::setFile(QString fileName)
{svgWidget->load (fileName); //将新的 SVG 文件加载到 svgWidget 中进行显示。QSvgRenderer *render =svgWidget->renderer();svgWidget->resize (render->defaultSize ()); //使 svgWidget 窗体按 SVG 图片的默认尺寸进行显示。
}
/*当鼠标键被按下时,对 mousePressPos 和 scrol!BarValuesOnMousePress 进行初始化,
QScrollArea 类的 horizontalScrol!Bar()和 verticalScrollBar() 函数可以分别获得 svgWindow 的水平
滚动条和垂直滚动条。*/
void SvgWindow::mousePressEvent(QMouseEvent *event)
{mousePressPos =event->pos () ;scrollBarValuesOnMousePress.rx()=horizontalScrollBar()->value();scrollBarValuesOnMousePress.ry() =verticalScrollBar () ->value () ;event->accept();
}
//当鼠标键被按下并拖曳鼠标时触发 mouseMoveEvent()函数,通过滚动条的位置设置实现图片拖曳的效果,
void SvgWindow::mouseMoveEvent(QMouseEvent *event)
{//对水平滚动条的新位置进行设置horizontalScrollBar()->setValue(scrollBarValuesOnMousePress.x()-event->pos() .x()+mousePressPos.x());verticalScrollBar()->setValue(scrollBarValuesOnMousePress.y()-event->pos() .y()+mousePressPos.y());horizontalScrollBar ()->update();verticalScrollBar()->update();event->accept();
}

四、总结

图像与图片的显示SVG格式图片会在应用程序开发中经常用到的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】设备入云之FlexManager主流控制器读写

文章目录前言一、主流控制器数据类型1、 SIEMENS S7-200_Network1、位数据2、无符号整数3、单精度浮点2、Mitsubishi FX3U_FX3G1、位数据2、无符号整数3、单精度浮点二、主流控制器数据调用实例1、 SIEMENS S7-200 数据调用1、状态位调用2、浮点数据调用3、无符号整数调用4、辅…

面试必问——什么是BFC问题

什么是BFC问题 面试必会知识BFC 一、什么是BFC BFC即 Block Formatting Contexts (块级格式化上下文)&#xff0c; 是 W3C CSS2.1 规范中的一个概念。BFC是指浏览器中创建了一个独立的渲染区域&#xff0c;并且拥有一套渲染规则&#xff0c;他决定了其子元素如何定位&#x…

基于 attention 机制的 LSTM 神经网络 超短期负荷预测方法学习记录

LSTM&#xff08;long short-term memory)长短期记忆 基础介绍 在标准LSTM体系结构中&#xff0c;有1个记忆单元状态和3个门&#xff0c;即更新门Γu、遗忘门Γf和输出门Γo&#xff0c;标准LSTM的体系结构如图2所示。采用x 1, x 2, …, x T 表示LSTM网络中的典型输入序列&am…

Linux常见命令

一、目录操作命令 1.目录切换 cd 命令&#xff1a;cd 目录 2 .目录查看 ls [-al] 命令&#xff1a;ls [-al] 3 .目录操作【增&#xff0c;删&#xff0c;改&#xff0c;查】 1 .创建目录【增】 mkdir 命令&#xff1a;mkdir 目录 2 删除目录或文件【删】rm 命令&#xff1a;rm …

数仓Hive和分布式计算引擎Spark多整合方式实战和调优方向

Hive与Spark之间整合有3种模式,本篇从Hive on Spark和Spark on Hive的使用出发,hive支持mr、tez和spark三种底层计算引擎,通过部署Hive on Spark环境实现Hive用到Spark的体验,Spark on Hive的使用则比较简单直接通过SQL操作Hive,最后罗列常见的一些大数据性能调优方法。@目…

Javaweb学生信息管理系统(Mysql+JSP+MVC+CSS)

目录 一.项目介绍 二.运行效果 1.登录界面 2.主界面&#xff08;点击学号修改学生信息&#xff09; 3.增加学生界面 ?编辑 三.项目目录结构 ?四.代码展示 1.jsp及css代码 ?①登录界面代码&#xff08;login.jsp&#xff09; ②登录界面css&#xff08;login.css&…

HTTP协议中的“报头”(header)和 “正文“ (body)详解

系列文章目录 Fiddler抓包&#xff1a;下载、安装及使用_crazy_xieyi的博客-CSDN博客 HTTP协议格式、URL格式及URL encode_crazy_xieyi的博客-CSDN博客 GET和POST有什么区别&#xff1f;_crazy_xieyi的博客-CSDN博客 文章目录 一、请求“报头”(header)详解二、请求 "…

springboot校园师生出入登记系统java ssm

后台主要是管理员&#xff0c;管理员功能包括个人中心&#xff0c;通知公告管理&#xff0c;用户管理&#xff0c;工作人员管理&#xff0c;进门登记管理&#xff0c;出门登记管理&#xff0c;出入统计管理&#xff0c;外来登记管理等&#xff1b; 系统对这些功能进行整合 本次…

【操作系统】系统启动流程

文章目录系统启动流程&#xff08;Linux&#xff09;BIOSMBRGRUB2启动引导内核引导systemd固件和BIOSBIOS分类关于legacy关于uefibootloader 启动管理器kernel初始化systemd - 守护进程总结系统启动流程&#xff08;Linux&#xff09; 1. BIOS 加电自检 2. 把 MBR 加载到内存 …

MyBatis的各种查询功能(5种)

MyBatis的各种查询功能(5种) 查询一个实体类对象&#xff1a; 新建一个SelectMapper的接口文件 新建一个SelectMapper.xml的映射文件 新建一个测试类SelectMapperTest.java文件 在接口文件中添加查询一条语句的方法声明 在映射文件中添加sql语句 在测试类中编写查询一条语句…

spark(day04)

数据挖掘 数据挖掘∶也就是data mining&#xff0c;是一个很宽泛的概念&#xff0c;也是一个新兴学科&#xff0c;旨在如何从海量数据中挖掘出有用的信息来。 数据挖掘这个工作Bl&#xff08;商业智能&#xff09;可以做&#xff0c;统计分析可以做&#xff0c;大数据技术可以做…

哈希的使用

文章目录1. 哈希的使用1.1 unordered_set1.2 unordered_map1.3 测试效率2 练习题2.12.21. 哈希的使用 map、set和哈希的区别&#xff1a; map是双向迭代器&#xff0c;哈希表是单向迭代器。map有序&#xff0c;哈希无序。map查找是logn&#xff0c;哈希是O(1); 1.1 unordered…

Java | static关键字的应用【工具类、代码块和单例】

在上一篇文章讲完了static关键字的一些基础知识后&#xff0c;我们就来说一说这个关键字在应用开发中具体可以怎么使用吧&#xff0c;希望看完这篇文章可以对您有帮助&#x1f4d6; static关键字在具体开发中的应用一、工具类1、什么是工具类&#xff1f;2、使用工具类有什么好…

Spring

目录 1、Spring 1.1、简介 1.2、优点 1.3、组成 1.4、拓展 2、IOC理论推导 2.1、原来的实现 2.2、需求变更 2.3、改进 2.4、IOC本质 设计思想 2.5、Spring和IoC的关系 3、HelloSpring 3.1、基础环境 3.2、导包 3.3、编写代码 思考问题&#xff1f; 4、IOC创建…

grpc|protobuf的安装、编译、运行笔记(C++)

一、下载grpc源码 如果你的电脑/服务器可以做代理&#xff0c;然后稳定链接上 GitHub 那么完全可以按照 GitHub 的官方文档来操作&#xff0c;我这里采用 Gitee 镜像来操作 git clone https://gitee.com/jiangxy__loey/grpc.git二、下载依赖库 进入grpc目录&#xff0c;然后…

【数据结构】二叉树的顺序结构及实现,堆,向上调整算法,向下调整算法,数组建堆算法,堆排序

提示&#xff1a;学习本文之前&#xff0c;要先了解一下树的概念及结构&#xff0c;二叉树的概念及结构&#xff0c;详情请至博客。 文章目录1.二叉树的顺序结构2.堆的概念及结构3.堆的实现3.1堆的总实现3.2堆的向上调整算法---O(logN)3.3堆的向下调整算法---O(logN)4.数组建堆…

【JavaWeb】一文搞懂Response

文章目录1 Response继承体系2 Response响应2.1 响应行2.2 响应头2.3 响应体3 Response 重定向3.1 什么是重定向3.1.1 重定向实现的步骤3.1.2 例子3.2 重定向简化3.3 重定向的特点3.4 资源路径&#xff08;要不要加虚拟目录&#xff09;3.4.1 两种情况3.4.2 动态配置虚拟目录4 R…

python的脚本如何执行

运行python脚本的几种方法&#xff1a; 一. 终端命令行下 []$python "name.py" 二. python环境中 若脚本名称为name.py&#xff0c; 其内容为&#xff1a; a"head" b"hehe" print(a,b) 则使用 >>>impport name 针对此种方法我们使用下面…

vue路由传参

今天介绍路由传递参数的方式。首先要明白路由跳转的两种方式一种是声明式导航另一种是编程式导航。 参数的形式&#xff1a; params参数&#xff1a;属于路径中的一部分&#xff0c;需要注意的是在配置路由时需要占位query参数&#xff1a;不属于路径中的一部分&#xff0c;不…

Matter over Wi-Fi: Raspberry Pi 4开发环境设置

以下是使用 Raspberry Pi 4 通过 Wi-Fi 构建Matter的步骤: 入门 1. 刷入 SD 卡上的 Ubuntu 操作系统。 2. 将 SD 卡&#xff08;直接或使用读卡器&#xff09;插入运行 raspberry pi imager 工具的笔记本电脑/PC。 3. 启动 Raspberry Pi 4 成像仪。 4.点击“CHOOSE OS”…
最新文章