基于Qt实现SVG图片浏览器

目录
  • 介绍
  • 一、项目介绍
  • 二、项目基本配置
  • 三、UI界面设计
  • 四、主程序实现
    • 4.1 .pro文件
    • 4.2 添加SvgWindow类
    • 4.3 添加SvgWidget类
    • 4.4 svgwidget.h头文件
    • 4.5 svgwidget.cpp源文件
    • 4.6 svgwindow.h头文件
    • 4.7 svgwindow.cpp源文件
    • 4.8 mainwindow.h头文件
    • 4.9 mainwindow.cpp源文件
  • 五、效果演示

介绍

SVG的英文全称是Scalable Vector Graphics,即可缩放的矢量图形。它是由万维网联盟(W3C)在2000年8月制定的一种新的二维矢量图形格式,也是规范中的网格适量图形标准,是一个开放的图形标准。

SVG格式的特点如下:

(1)基于XML

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

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

(4)完全支持DOM

SVG相对于GIF、JPEG格式的优势是,SVG是一种矢量图形格式,比GIF、JPEG等栅格格式具有众多优势,如文件小、可任意缩放而不破坏图像的清晰度和细节等。
Qt为SVG格式图片的显示与生成提供了专门的QtSvg模块,此模块中包含了与SVG图片相关的所有类,主要有QSvgWidget、QSvgRender和QGraphicsSvgItem。

一、项目介绍

利用QtSvg实现SVG图片浏览器,可以显示SVG结尾的文件图片。

二、项目基本配置

新建一个Qt案例,项目名称为“SVGTest”,基类选择“QMainWindow”,取消创建UI界面复选框的选中状态,完成项目创建。

三、UI界面设计

无UI界面

四、主程序实现

4.1 .pro文件

如果是QT5版本,需要在pro工程文件中加入一行代码:

QT+=svg

如果是QT6版本,需要在pro工程文件中加入一行代码:

QT+=svgwidgets

【不同Qt版本,添加的qmake不相同,这里建议参考帮助文档:】

4.2 添加SvgWindow类

项目名——>鼠标右键——>Add New——>C++ Class——>添加如下内容

创建完成后,项目中会出现svgwindow.h和svgwindow.cpp。

4.3 添加SvgWidget类

项目名——>鼠标右键——>Add New——>C++ Class——>添加如下内容

创建完成后,项目中会出现svgwidget.h和svgwidget.cpp,如下所示:

4.4 svgwidget.h头文件

SvgWidget类继承自QSvgWidget类,主要显示SVG图片。

在public中声明一下响应鼠标的滚动事件,使SVG图片可以通过鼠标滚动进行缩放,然后声明render变量,用于图片显示尺寸的确定:

#include <QSvgWidget>
#include<QtSvg>
#include<QSvgRenderer>
public:
    void wheelEvent(QWheelEvent *);//响应鼠标的滚动事件,使SVG图片可以通过鼠标滚动进行缩放
private:
    QSvgRenderer *render;//用于图片显示尺寸的确定

4.5 svgwidget.cpp源文件

SvgWidget函数获得本窗体的QSvgRenderer对象,代码如下:

SvgWidget::SvgWidget()
{
    render=renderer();
}

然后定义鼠标滚轮的响应事件,使SVG图片可以通过鼠标滚动进行缩放:

void SvgWidget::wheelEvent(QWheelEvent *e)
{
    const double diff=0.1;//diff的值表示每次滚轮滚动一定的值,图片大小改变的比例
    //用于获取图片显示区的尺寸
    QSize size=render->defaultSize();
    int width=size.width();
    int height=size.height();
    //利用QWheelEvent的相关函数获得滚轮滚动的距离值,通过此值判断滚轮滚动的方向
    //若此值大于0,则表示滚轮向前(远离用户方向)滚动;
    //若此值小于0,则表示滚轮向后(靠近用户方向)滚动;
    //Qt6使用e->angleDelta().y()
    //Qt5请使用e->delta()
    if(e->angleDelta().y()>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);//重新调整大小
}

4.6 svgwindow.h头文件

SvgWindow类继承自QScrollArea,是一个带滚动条的显示区域。在SvgWindow类实现包含"svgwidget.h"的头文件,该类使图片在放大到超过主窗口大小时,能够通过拖拽滚动条的方式进行查看。

添加代码如下:

#include"svgwidget.h"
public:
    void setFile(QString);
    void mousePressEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
private:
    SvgWidget *svgWidget;
    QPoint mousePressPos;
    QPoint scrollBarValuesMousePress;

4.7 svgwindow.cpp源文件

主函数内进行设置滚动区的窗体,使svgWidget成为SvgWindow的子窗口:

    svgWidget=new SvgWidget;
    setWidget(svgWidget);

当主窗口中对文件进行了选择或修改时,调用setFile()函数设置新的文件:

//设置新的文件
void SvgWindow::setFile(QString filename){
    svgWidget->load(filename);//将新的SVG文件加载到svgWidget中进行显示
    QSvgRenderer *render=svgWidget->renderer();
    svgWidget->resize(render->defaultSize());//按照SVG文件的默认尺寸进行显示
}

鼠标按下时,获取水平滚动条和垂直滚动条的值:

//鼠标按下响应函数
void SvgWindow::mousePressEvent(QMouseEvent *e)
{
    mousePressPos=e->pos();
    scrollBarValuesMousePress.rx()=horizontalScrollBar()->value();
    scrollBarValuesMousePress.ry()=verticalScrollBar()->value();
    e->accept();
}

当鼠标键按下并且拖拽鼠标时触发mouseMoveEvent()函数,通过滚动条的位置设置实现图片拖拽效果:

//鼠标按下且拖拽响应函数
void SvgWindow::mouseMoveEvent(QMouseEvent *e)
{
    horizontalScrollBar()->setValue(scrollBarValuesMousePress.x()-
                                    e->pos().x()+mousePressPos.x());//对水平滚动条的新位置进行设置
    verticalScrollBar()->setValue(scrollBarValuesMousePress.y()-
                                  e->pos().y()+mousePressPos.y());//对垂直滚动条的新位置进行设置
    horizontalScrollBar()->update();
    verticalScrollBar()->update();
    e->accept();
}

4.8 mainwindow.h头文件

头文件中包含"svgwindow.h"头文件,并且声明打开文件菜单的槽函数和svgwindow用于调用相关函数传递选择的文件名:

#include"svgwindow.h"

public slots:
    void slotOpenFile();//打开文件槽函数

private:
    SvgWindow *svgwindow; //用于调用相关函数传递选择的文件名

4.9 mainwindow.cpp源文件

主窗口MainWindow包含一个菜单栏,其中有一个“文件”子菜单,包含一个“打开”菜单项,代码如下:

    setWindowTitle("SVG Viewer");//设置窗口标题
    QMenu *fileMenu=menuBar()->addMenu("文件");//菜单栏添加"文件"
    QAction *openAct=new QAction("打开",this);//"文件"中添加"打开"子菜单
    connect(openAct,SIGNAL(triggered()),this,SLOT(slotOpenFile()));//点击打开触发slotOpenFile()槽函数
    fileMenu->addAction(openAct);
    svgwindow=new SvgWindow;
    setCentralWidget(svgwindow);
    resize(800,600);//初始大小

定义打开菜单的槽函数:

//打开菜单的槽函数
void MainWindow::slotOpenFile()
{
    QString name=QFileDialog::getOpenFileName(this,"打开","/","svg files(*.svg)");
    svgwindow->setFile(name);
}

五、效果演示

以上就是基于Qt实现SVG图片浏览器的详细内容,更多关于Qt SVG图片浏览器的资料请关注我们其它相关文章!

(0)

相关推荐

  • QT利用QProcess获取计算机硬件信息

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 widget.h头文件 4.2 widget.cpp源文件 五.效果演示 一.项目介绍 本文介绍利用QProcess获取计算机的CPU.主板.硬盘等电脑相关硬件信息. windows提供了“wmic”(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口和批命令脚本执行系统管理的支持.可以打开cmd在其中输入如下命令,获取相关的信息. //获取cpu名称

  • QT实战之打开最近图片功能的实现

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 五.效果演示 一.项目介绍 本文介绍利用Qt和QSettings实现打开最近图片功能. 二.项目基本配置 新建一个Qt案例,项目名称为“RecentPhotoTest”,基类选择“QMainWindow”,取消选中创建UI界面复选框,完成项目创建. 三.UI界面设置 无UI界面 四.主程序实现 4.1 mainwindow.h头文件 头文件中

  • Qt实现字幕滚动效果的示例代码

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 widget.h头文件 4.2 widget.cpp源文件 五.效果演示 一.项目介绍 利用QTimer实现字幕滚动功能,可以实现自行更改文本内容.自适应文本大小.自由调整速度等功能. 二.项目基本配置 新建一个Qt案例,项目名称为“TextScroll”,基类选择“QWidget”,取消创建UI界面复选框的选中状态,完成项目创建. 三.UI界面设计 无UI界面 四.主程序实现 4.1 widget.h头文件 声明私

  • 基于Qt实现简易GIF播放器的示例代码

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 五.效果演示 一.项目介绍 利用Qt设计一个简易GIF播放器,可以播放GIF动画.其基本功能有载入文件.播放.暂停.停止.快进和快退. 二.项目基本配置 新建一个Qt案例,项目名称为“GIFTest”,基类选择“QMainWindow”,创建UI界面复选框的选中状态,完成项目创建. 三.UI界面设计 UI界面如下: 界面中创建了8个控件,其名

  • QT实战之打开最近文档功能的实现

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 4.3 main.cpp 五.效果演示 一.项目介绍 本文介绍利用Qt实现打开最近文档功能,并实现基本的新建.打开.保存.退出.帮助等功能. 二.项目基本配置 新建一个Qt案例,项目名称为“RecentTest”,基类选择“QMainWindow”,取消选中创建UI界面复选框,完成项目创建. 三.UI界面设置 无UI界面 四.主程序实现 4.

  • 基于Qt实现SVG图片浏览器

    目录 介绍 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 .pro文件 4.2 添加SvgWindow类 4.3 添加SvgWidget类 4.4 svgwidget.h头文件 4.5 svgwidget.cpp源文件 4.6 svgwindow.h头文件 4.7 svgwindow.cpp源文件 4.8 mainwindow.h头文件 4.9 mainwindow.cpp源文件 五.效果演示 介绍 SVG的英文全称是Scalable Vector Graphics,

  • 基于Python打造账号共享浏览器功能

    本篇文章介绍的内容会涉及到以下知识: PyQt5的使用; Selenium的使用; 代理服务器的架设和使用: 一.账号限制之痛 在如今的互联网中,免费的信息和资源占据了很大一部分,各类互联网应用提供了各行各业的资讯和资源.这是互联网能够不断繁荣和扩大的重要原因之一. 与此同时,一些收费或不公开的互联网应用则构成了互联网世界中更有价值和意义的部分. 一些限制性较低的网站,可能仅仅需要进行用户登录即可使用服务: 一些限制性中等的网站,则可能会出于账户安全或是其他方面的因素考虑,限制账号在一定时间一定

  • vue基于viewer实现的图片查看器功能

    vue2-viewer vue2-viewer 是一款强大的图像浏览插件,可以实现图像的放大预览,旋转,任意比例放大和缩小等功能 vue2-viewer 是viewer.js vue的实现,效果以及样式完全移植自viewer.js关于viewer.js可以参考链接 [http://fengyuanchen.github.io...] 插件中所有的效果均大量地使用了css3的新特性替换了viewer.js中的js动画,所以vue2-viewer主要实用场景是现代浏览器中. 使用文档 安装 npm

  • JS端基于download.js实现图片、视频时直接下载而不是打开预览

    项目中的附件列表,通常情况都需要提供下载.删除的功能,功能本身没有什么要说的,都是基本功能,使用浏览器的的下载功能,也都是用window.open(url),或者window.location.href=url的方式,url即为附件下载接口,浏览器自动解析,如果是图片.视频.txt等格式的会直接预览文件,而不是像docx.xlsx一样直接下载,项目中为了功能明确,将预览单独加了一个查看按钮,下载按钮要实现无论什么文件格式都直接下载. 有两种方式处理: 一.后台接口层面处理:(比较常见) 响应头中

  • Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来

    在之前的几篇文章中,介绍了业界中比较火爆的图片技术SVG(Scalable Vector Graphics),比如Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript来打造属于自己的个性化社交分享系统 ,我们可以使用svg来打造精美炫酷的分享小图标(icon),这一次我们使用python来将普通的静态的网站logo图片转换为带路径(path)的svg图片,这样就可以让网站logo能够变成动态的,作为一名不折腾不舒服斯基,一枚炫酷自带动画的网站logo自然能够满

  • 基于Qt实现离线瓦片地图下载器

    目录 一.前言 二.功能特点 三.体验地址 四.效果图 五.相关代码 一.前言 写这个离线地图下载器的初衷,就是为了方便自己的几个需要离线地图的程序,客户需求,既然地图程序已经可以支持离线地图,那如何获取到这些离线瓦片地图文件是个关键,而且这是这个功能的关键,拿到这些一张张的瓦片图片文件,才能根据js函数绘制组合成离线地图. 网上其实有很多各种各样的离线地图下载器,大部分都是要收费的,免费的要么是限制了下载的瓦片数量或者级别,要么是下载的瓦片图打上了水印,看起来很难看,由于经常需要用到离线地图,

  • 基于QT设计一个春联自动生成器

    目录 1. 前言 2. 实现原理 3. 示例代码 3.1 获取春联接口 3.2 数据解析代码 3.3 token数据存储 1. 前言 春节是中国最隆重的传统节日,一到过年家家户户肯定是要贴春联:在春节前夕,会用大红纸张,加上浓墨书写祝福词语,在春节当天贴于门框两边,寓意着一年吉祥如意,还会将福字倒转贴于门上,有"福到临门"的意思.为了方便找到合适的春联句子,我这里就采用现成的自然语言处理接口实现了一个自动生成春联的软件,输入提示词就可以完成春联的生成,方便写春联时参考. 下面是实现的效

  • 基于QT的TCP通信服务的实现

    目录 一.结构 1.1 套接字 1.2 socket通信流程 1.3 QTcpsocket 1.4 QTcpServer 二.设计UI 2.1 客户端UI 2.2 服务器端UI 三.核心代码 四.效果图 一.结构 1.1 套接字 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字

  • 基于Qt编写简易的视频播放器

    目录 一.前言 二.效果图 三.体验地址 四.相关代码 五.功能特点 5.1 基础功能 5.2 特色功能 5.3 视频控件 5.4 内核ffmpeg 一.前言 花了一年多的时间,终于把这个超级播放器做成了自己想要的架构,用户的需求是一方面,自己架构方面的提升也是一方面,最主要是将界面和解码解耦了,这样才能动态的挂载不同的解码内核到不同的窗体,多对多关系,而且解耦和才能方便的实现共享解码,整个设计参照了Qt的设计思路,将各种功能做成不同的类组件,同时还有多层基类的设计,最大的提炼共性,本组件设计的

随机推荐