QT中由图形生成SVG文件实现方案

本文介绍QT的2D绘图系统,包括QPainter、QPainterDevice和QPainterEngine的作用,以及如何使用QSvgGenerator生成SVG文件。此外,还详细讲解了GraphicsView框架的工作原理及其如何将内容导出为SVG格式。
摘要由CSDN通过智能技术生成
 

一.      QT 的 2D 绘图

QT 的 2D 绘图由三个主要的类搭起整个框架: QPainter , QPainterDevice 和 QPainterEngine 。

1.  QPainter 负责绘图操作的具体执行,如画点,画线,填充,变换等。

2.  QPainterDevice 为 QPainter 用来绘图的绘图设备基类,其实际预定义的子类绘图设备包括 Qwidget,QImage,QPixmap,QPicture,QPrinter , QSvgGenerator 等。

3.  QPainterEngine 提供不同类型设备的接口,实现交互。

 

二.      QSvgGenerator

QSvgGenerator 属于 QT 中的 QtSvg 模块,是用于生成 SVG 文件的绘图设备类,派生于 QPainterDevice 基类。

使用 QPainter 进行绘图,并使用 QPainter::begint() 和 end() 显性地在 QSvgGenerator 上开始和结束绘图。在生成 SVG 文件时,可以指定文件名,文件名路径, SVG 标签属性等。

三.      Graphics View 框架

Graphics View 框架为基于图元的模型视图模型,包括主要三个类: QGraphicsScene , QGraphicsView , QGraphItem ,分别为场景,视图,图元。

1.  QGraphicsScene :场景管理多个图元,可以传播事件给每个被管理的图元,实现图元的选择,焦点转移,提供无变换的场景的绘制。

场景是图元的容器,通过 QGraphicsScene::addItem() 可以将图元加入场景容器中。

场景使用 render() 函数在指定绘图设备上进行场景的绘制。

2.       QGraphicsView :视图窗口部件,使场景内容可视化。一个场景可以同时拥有几个视图,这样就意味着相同的场景可以实现不同的可视化窗口。

视图可提供滚动条以浏览大的场景,可以选择 QPainter 或者 OpenGL 两种绘图方式绘图。可以接收键盘,鼠标事件。

视图与场景拥有不同的坐标系统,两者之间可通过 mapToScreen() 和 mapFromScene() 函数实现坐标转换。

3.       QGraphicsItem :图元基类,其派生的常用标准图元有 QGraphicsRectItem , QGraphicsLineItem , QGraphicsSvgItem 等,另外可以自定义派生于 QGraphicsItem 的图元类。图元可处理鼠标,键盘,拖放,分组,碰撞检测等事件,拥有自己的坐标系统,可以变换,可以包含子图元。

四.      Graphics View 框架视图的 SVG 文件导出

Graphics View 框架通过 QGraphicsScene::render() 函数和 QGraphicsView::render() 函数,实现将场景和视图上的内容绘制到任意的绘图设备上,两个函数的区别在于使用不同的坐标系统。 QGraphicsScene::render() 用于无变换的场景绘制,如静态几何图形,文本文档等。 QGraphicsView::render() 类似于实现屏幕快照,将当前视图数据绘制到指定绘图设备上。

五.      示例

// 创建保存SVG 文件对话框

QString newPath = QFileDialog::getSaveFileName(this , tr("Save SVG" ),

         path, tr("SVG files (*.svg)" ));

if (newPath.isEmpty())

         return ;

// 指定文件保存路径

path = newPath;

// 创建QSvgGenerator 对象

QSvgGenerator generator;

generator.setFileName(path);

// 创建QPainter 绘图对象

QPainter painter;

// 开始在QSvgGenerator 对象上绘图

painter.begin(&generator);

//QGraphicsView 数据导入绘图对象

view->render(&painter);

// 绘图结束,QSvgGenerator 对象自动生成SVG 文档

painter.end();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值