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

一.      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();

你可能感兴趣的:(QT)