当前位置: 首页 > news >正文

《Qt6开发及实例》6-4 显示SVG格式图片

目录

一、简介与设计

1.1 简介

1.2 设计

二、SvgWidget

2.1 鼠标滚轮事件

三、svgwindow

四、MainWindow


 

一、简介与设计

1.1 简介

1、SVG 的英文全称是 Scalable Vector Graphics,即可缩放的矢量图形。它是由万维网联盟(W3C)在 2000 年 8 月制定的一种新的二维矢量图形格式

 

2、SVG 的特点如下:

(1) 基于XML

(2) 采用文本来描述对象

(3)  具有交互性和动态性

(4) 完全支持 DOM

 

3、SVG 中画折线的标签如下

<polyline fill="none" stroke="#888888" stroke-width="2" points="100, 200, 100, 100"/>

polyline:表示绘制折线

fill:表示填充

stroke:表示画笔颜色

stroke-width:表示画笔宽度

points:表示折线的点

 

4、SVG 是一种矢量图形格式,比 GIF、JPGE 等栅格格式具有众多优势,如文件小;可任意缩放而不会破坏图像的清晰度和细节;图像中的文字独立于图像,文字保留可编辑和可搜寻的状态

 

5、Qt 的 XML 模块支持两种 XML 解析方法:DOM 和 SAX。DOM 方法将 XML 文件表示为一棵树,可以随机访问其中的节点,内存消耗较大。SAX 是一种事件驱动的 XML API,其速度快,但不便于随机访问任意节点

 

6、Qt 为 SVG 格式图片的显示与生成提供了专门的 QtSvg 模块,此模块中包含了与 SVG 图片相关的所有类,主要有 QtSvgWidget、QSvgRender 和 QGraphicsSvgItem

 

1.2 设计

界面

通过 QtSvgWidget 类和 QSvgRender 类实现一个 SVG 图片浏览器,显示以 ".svg" 结尾的文件以介绍 SVG 格式图片显示的方法

0b644129823646dca53b691a84c57507.png

结构

847f22a1383d4a4a9f0c2370d73fe760.jpg

 

建立项目

项目名:SVGTest

40ec05314c304efa95fb77c07e3f7771.png

 a4c4cda80db9430ab9f9965bab3876a0.png

1498c2004c8f47e79d9340bd8a017cb7.png

90b966bea97e4adfa2ef3898181e6a52.png

 

二、SvgWidget

2.1 鼠标滚轮事件

aac823775d154976be21485f947ad1ba.png

svgwidget.h

#ifndef SVGWINDOW_H
#define SVGWINDOW_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 // SVGWINDOW_H

svgwidget.cpp

#include "svgwidget.h"SvgWidget::SvgWidget(QWidget *parent) : QSvgWidget(parent)
{render = renderer();
}// 鼠标滚动事件
void SvgWidget::wheelEvent(QWheelEvent *e)
{const double diff = 0.1;             //(a)QSize size = render->defaultSize();  //(b)int width = size.width();int height = size.height();if(e->angleDelta().y() > 0)          //(c){//对图片的长、宽值进行处理,放大一定的比例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()操作
}

(a) const double diff = 0.1; 

鼠标每滚动一次,图片大小改变的比例,这个可以写在配置文件里面

 

(b) QSize size = render->defaultSize();

这一句和后面两句用于获取图片尺寸

 

(c) if(e->angleDelta().y() > 0)

获取鼠标滚动的角度,e->angleDelta().y() > 0 表示鼠标向远离用户的方向滚动。滚轮每滚动 1° 相当于移动 8°,常见鼠标滚动一下的角度为 15°,所以滚动一下相当于移动了 120°(=15°*8)

 

三、svgwindow

0b2b3fb64b2647498c749d18e4dec084.png

 svgwindow.h

#ifndef SVGWINDOW_H
#define SVGWINDOW_H#include <QScrollArea>
#include "svgwidget.h"// SvgWindow继承自QScrollArea类,是一个带滚动条的显示区域。
// 它包含svgWidget类,当图片放大到超过主窗口大小时,能够通过滚
// 轮查看全貌
class SvgWindow : public QScrollArea
{
public:SvgWindow(QWidget *parent = 0);void setFile(QString);void mousePressEvent(QMouseEvent *);void mouseMoveEvent(QMouseEvent *);private:SvgWidget *svgWidget;QPoint mousePressPos;QPoint scrollBarValueOnMousePress;
};#endif // SVGWINDOW_H

svgwindow.cpp

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

 

四、MainWindow

83bb3a25c89b4cc99e00c8681ed5f271.png

 mainwindow.h

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

mainwindow.cpp 

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): 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);
}//显示SVG
void MainWindow::slotOpenFile()
{QString name = QFileDialog::getOpenFileName(this, " 打 开 ", "/", "svg files(*.svg)");svgWindow->setFile(name);
}

 

 

 

相关文章:

《Qt6开发及实例》6-4 显示SVG格式图片

目录 一、简介与设计 1.1 简介 1.2 设计 二、SvgWidget 2.1 鼠标滚轮事件 三、svgwindow 四、MainWindow 一、简介与设计 1.1 简介 1、SVG 的英文全称是 Scalable Vector Graphics&#xff0c;即可缩放的矢量图形。它是由万维网联盟&#xff08;W3C&#xff09;在 200…...

OpenGL ES 绘制一张图片

GLSL 语法与内建函数 GLSL 的修饰符与数据类型 GLSL 中变量的修饰符 const&#xff1a;修饰不可被外界改变的常量attribute&#xff1a;修饰经常更改的变量&#xff0c;只可以在顶点着色器中使用uniform&#xff1a;修饰不经常更改的变量&#xff0c;可用于顶点着色器和片段…...

Python 之 Pandas DataFrame 数据类型的行操作和常用属性和方法汇总

文章目录一、DataFrame 行操作1. 标签选取2. 数值型索引和切片3. 切片操作多行选取4. 添加数据行4.1 追加字典4.2 追加列表5. 删除数据行二、常用属性和方法汇总1. 转置2. axes3. dtypes4. empty5. columns6. shape7. values8. head() & tail()9. 修改列名 rename()10. inf…...

MacOS下载钉钉直播回放视频的Python最新解决方案

tags: Python MacOS Tips 写在前面 之前写过一篇关于用Charles抓包下载钉钉直播回放视频的方法, 那会还是可以直接通过FFmpeg下载m3u8链接并且直接合并的, 但是现在直接上FFmpeg会出现403, 所以还是用别的方法来做吧. 后来发现抓包找到的m3u8不是加密视频流, 那就直接下载ts…...

2023年测试人跳槽新功略,涨薪10K+

软件测试是如何实现涨薪的呢&#xff1f;很多人眼中的软件测试岗位可能是简单的&#xff0c;技术含量不是那么高&#xff0c;就是看看需求、看业务、设计文档、然后点一点功能是否实现&#xff0c;再稍微深入一点就是测试下安装部署时会不会出现兼容性问题&#xff0c;以及易用…...

RabbitMQ之Work Queues

Work Queues 工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务…...

CRM哪家好?这5个CRM管理系统很好用!

CRM哪家好&#xff1f;这5个CRM管理系统很好用&#xff01; CRM(Customer Relationship Management)即客户关系管理&#xff0c;能够帮助提高客户的价值、满意度、赢利性和忠实度&#xff0c;缩减销售周期和销售成本、增加收入、寻找扩展业务所需的新的市场和渠道&#xff0c;…...

国内ce认证机构有哪些 国内十大CE认证机构排名 做ce认证的公司推荐

CE认证&#xff0c;是任何企业的任何产品走进欧盟市场的硬性要求。挑选CE认证机构&#xff0c;一定要认准拥有正规资质的机构/企业&#xff0c;例如中国质量认证中心CQC、CVC威凯、CTI华测检测&#xff0c;以及TV南德认证、安博检测、万泰认证等。本文中&#xff0c;MaiGoo小编…...

多If函数封装的策略

在工作中我们经常遇到有多个if的判读函数&#xff0c;这是一件很正常的事情&#xff0c;如下&#xff1a; let order function (orderType, isPay, count) {if (orderType 1) {// 充值 500if (isPay true) {// 充值成功console.log(中奖100元)} else {if (count > 0) {c…...

238. 银河英雄传说

Powered by:NEFU AB-IN Link 文章目录238. 银河英雄传说题意思路代码238. 银河英雄传说 题意 有一个划分为 N列的星际战场&#xff0c;各列依次编号为 1,2,…,N 有 N艘战舰&#xff0c;也依次编号为 1,2,…,N&#xff0c;其中第 i号战舰处于第 i列。 有 T条指令&#xff0c;每…...

centos7 开机自启动自定义脚本

centos7 开机自启动自定义脚本背景配置自启动jar1.首先书写自启动脚本2.在rc.local中加入脚本reboot测试docker版本的自启动背景 项目中有遇到2个问题&#xff0c; 1&#xff1a; 使用java启动jar包 2&#xff1a; docker容器中自启动个服务。 这2个都要使用linux的开机自启动问…...

【Linux】动静态库的制作

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;动静库和静…...

数据备份学习笔记2

Linux实现本地备份的命令&#xff1a; mkdir -p /root/backup/date "%Y-%m-%d" tar -zcvPf /root/backup/date "%Y-%m-%d"/test20230221.tar.gz /root/test20230221/ 我们再看下tar命令选项&#xff1a; tar -czvf txt3.tar.gz txt3 tar -xvf txt4.tar.g…...

webRTC

WebRTC是一种实时通信技术&#xff0c;可以在浏览器中实现音频、视频和数据的实时传输。WebRTC使用标准的API和协议&#xff0c;如RTCPeerConnection和RTCDataChannel等&#xff0c;可以实现点对点通信和多方会议等多种应用场景。WebRTC可以应用于Web前端、移动端和桌面端等多种…...

用Python搓一个黑洞

文章目录简介单位制观测绘图简介 黑洞图像大家都知道&#xff0c;毕竟前几年刚发布的时候曾火遍全网&#xff0c;甚至都做成表情包了。 问题在于&#xff0c;凭什么认为这就是黑洞的照片&#xff0c;而不是一个甜甜圈啥的给整模糊了得到的呢&#xff1f;有什么理论依据吗&…...

Spring MVC常用功能及注解

目录 一、什么是Spring MVC 1.1 Spring MVC定义 1.2 MVC定义 1.3 MVC和Spring MVC的关系 1.4 Spring MVC的作用 二、Spring MVC的使用 2.1 Spring MVC的创建和连接 2.1.1 RequestMapping注解 2.1.2 GetMapping注解 2.1.3 PostMapping注解 2.2 获取参数 2.2.1 获取单…...

shell 编程

文章目录一、shell 编程1.1. 脚本执行1.2. 变量1.3. 特殊变量1.4. 运算符1.5. for 循环1.6. while 循环1.7. case 语句1.8. read 命令1.9. if 判断1.10. 判断语句1.11. 自定义函数1.12. 脚本调试二、sed2.1. sed 选项2.2. sed function2.3. sed 删除&#xff08;d 命令&#xf…...

Leetcode.1401 圆和矩形是否有重叠

题目链接 Leetcode.1401 圆和矩形是否有重叠 Rating &#xff1a; 1709 题目描述 给你一个以 (radius, xCenter, yCenter)表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2)&#xff0c;其中 (x1, y1)是矩形左下角的坐标&#xff0c;而 (x2, y2)是右上角的坐标。 如果圆和矩…...

CHAPTER 3 Web Server - httpd配置(二)

Web Server - httpd配置二3.1 httpd配置3.1.1 基于用户的访问控制3.1.2 basic认证配置示例&#xff1a;1. 添加用户2. 添加网页文件3. 定义安全域4. 修改父目录权限5. 访问效果6. 在配置文件中定义一个".htaccess"隐藏文件7. 添加组3.1.3 虚拟主机1. 构建方案2. 基于…...

VSCode 连接 SSH 服务器

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/129133964 配置VSCode 下载VSCode:https://code.visualstudio.com/ 安装 Remote - SSH: 点击右下角蓝色图标: 连接服务器: 即可。 默认连接:ssh chen…...

Flink 高可用集群部署指南

一、部署架构设计 1. 集群架构 graph TDClient([客户端]) --> JM1[JobManager 1]Client --> JM2[JobManager 2]Client --> JM3[JobManager 3]subgraph ZooKeeper集群ZK1[ZooKeeper 1]ZK2[ZooKeeper 2]ZK3[ZooKeeper 3]endsubgraph TaskManager集群TM1[TaskManager 1…...

pytorch3d+pytorch1.10+MinkowskiEngine安装

1、配置pytorch1.10cuda11.0 pip install torch1.10.1cu111 torchvision0.11.2cu111 torchaudio0.10.1 -f https://download.pytorch.org/whl/cu111/torch_stable.html 2、配置 MinkowskiEngine库 不按下面步骤&#xff0c;出现错误 1、下载MinkowskiEngine0.5.4到本地 2、查看…...

LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 CC 的 RedTeam 框架

一、软件介绍 文末提供程序和源码下载 LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 C&C 的 RedTeam 框架&#xff0c;具有隐藏活动的 rootkit、与 Windows/Linux/Mac OSX 兼容的不可检测的可塑植入物&#xff0c;以及自配置后门。凭借其 Web 界面和强大的…...

解决el-select选择框右侧下拉箭头遮挡文字问题

如图所示&#xff1a; el-select长度较短的时候&#xff0c;选择框右侧下拉箭头会遮挡选中的数据 选中数据被遮挡 解决办法&#xff1a; 组件如下&#xff1a; <td class"fmtd" :colspan"col.ptproCupNum" v-for"col in row" :key"…...

基于LLaMA-Factory和Easy Dataset的Qwen3微调实战:从数据准备到LoRA微调推理评估的全流程指南

随着开源大模型如 LLaMA、Qwen 和 Baichuan 的广泛应用&#xff0c;其基于通用数据的训练方式在特定下游任务和垂直领域中的表现仍存在提升空间&#xff0c;因此衍生出针对具体场景的微调训练需求。这些训练涵盖预训练&#xff08;PT&#xff09;、指令微调&#xff08;SFT&…...

物联网通信技术全景指南(2025)之如何挑选合适的物联网模块

物联网通信技术全景指南&#xff08;2025&#xff09;之 如何挑选合适的物联网模块 物联网通信技术全景指南&#xff08;2025&#xff09;一、技术代际演进与退网背景二、5G 物联网技术体系&#xff08;Sub-6 GHz 核心&#xff09;1. 技术分层架构2. 蜂窝技术性能矩阵3. Sub-6 …...

负载均衡相关基本概念

负载均衡在系统架构设计中至关重要&#xff0c;其核心目标是合理分配负载&#xff0c;提升系统整体性能和可靠性。本文简要介绍了负载均衡的基本概念&#xff0c;包括四层和七层负载均衡、负载均衡的使用场景和实现方式、负载均衡的常用算法以及一些配置相关知识。 1、负载均衡…...

学习日记-day23-6.6

完成目标&#xff1a; 知识点&#xff1a; 1.IO流_转换流使用 ## 转换流_InputStreamReader1.字节流读取中文在编码一致的情况,也不要边读边看,因为如果字节读不准,读不全,输出的内容有可能会出现乱码 2.所以,我们学了字符流,字符流读取文本文档中的内容如果编码一致,就不会出…...

c++ 基于openssl MD5用法

基于openssl MD5用法 #include <iostream> #include <openssl/md5.h> using namespace std; int main(int argc, char* argv[]) { cout << "Test Hash!" << endl; unsigned char data[] "测试md5数据"; unsigned char out[1024…...

Python使用clickhouse-local和MySQL表函数实现从MySQL到ClickHouse数据同步

下面是一个使用clickhouse-local和MySQL表函数实现从MySQL到ClickHouse数据同步的Python解决方案&#xff0c;包含全量同步、增量同步和测试用例。 此解决方案提供了生产级数据同步所需的核心功能&#xff0c;可根据具体场景扩展更多高级特性如&#xff1a;数据转换、字段映射…...