`
izuoyan
  • 浏览: 8933337 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Qt学习之路(30): Graphics View Framework

阅读更多
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/241186
现在基本上也已经到了2D绘图部分的尾声,所谓重头戏都是在最后压轴的,现在我们就要来看看在绘图部分功能最强大的Graphics View。我们经常说KDE桌面,新版本的KDE桌面就是建立在Graphics View的基础之上,可见其强大之处。
Qt的白皮书里面这样写道:“Qt Graphics View 提供了用于管理和交互大量定制的 2D 图形对象的平面以及可视化显示对象的视图 widget,并支持缩放和旋转功能。Graphics View 使用 BSP(二进制空间划分)树形可非常快速地找到对象,因此即使是包含百万个对象的大型场景,也能实时图形化显示。”
Graphics View是一个基于item的M-V架构的框架。
基于item意思是,它的每一个组件都是一个item。这是与QPainter的状态机不同。回忆一下,使用QPainter绘图多是采用一种 面向过程的描述方式,首先使用drawLine()画一条直线,然后使用drawPolygon()画一个多边形;而对于Graphics View来说,相同的过程可以是,首先创建一个场景scene,然后创建一个line对象和一个polygon对象,再使用scene的add()函数将 line和polygon添加到scene,最后通过视口view就可以看到了。乍看起来,后者似乎更加复杂,但是,如果你的图像中包含了成千上万的直 线、多边形之类,管理这些对象要比管理QPainter的draw语句容易得多。并且,这些图形对象也更加符合面向对象的设计要求:一个很复杂的图形可以 很方便的复用。
M-V架构的意思是,Graphics View提供一个model和一个view。所谓model就是我们添加的种种对象,所谓view就是我们观察这些对象的视口。同一个model可以由很 多view从不同的角度进行观察,这是很常见的需求。使用QPainter就很难实现这一点,这需要很复杂的计算,而Qt的Graphics View就可以很容易的实现。
Graphics View提供了一个QGraphicsScene作为场景,即是我们添加图形的空间,相当于整个世界;一个QGraphicsView作为视口,也就是我 们观察的窗口,相当于照相机的取景框,这个取景框可以覆盖整个场景,也可以是场景的一部分;一些QGraphicsItem作为图形元件,以便scene 添加,Qt内置了很多图形,比如line、polygon等,都是继承自QGraphicsItem。
下面我们来看一下代码:
#include <QtGui>

class DrawApp : public QWidget {
public :
DrawApp();
protected :
void paintEvent(QPaintEvent *event );
};

DrawApp::DrawApp()
{

}

void DrawApp::paintEvent(QPaintEvent *event )
{
QPainter painter(this );
painter.drawLine(10, 10, 150, 300);
}

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene *scene = new QGraphicsScene;
scene->addLine(10, 10, 150, 300);
QGraphicsView *view = new QGraphicsView(scene);
view->resize(500, 500);
view->setWindowTitle("Graphics View" );
view->show();

DrawApp *da = new DrawApp;
da->resize(500, 500);
da->setWindowTitle("QWidget" );
da->show();
return a.exec();
}
为了突出重点,我们就直接include了QtGui,不过在实际应用中不建议这么做。这里提供了直线的两种实现:一个是DrawApp使用我们前面介绍的技术,重写paintEvent()函数,这里就不在赘述,重点来看main()函数里面的实现。
首先,我们创建了一个QGraphicsScene作为场景,然后在scene中添加了一个直线,这样就把我们需要的图形元件放到了scene 中。然后创建一个QGraphicsView对象进行观察。就这样,我们就是用Graphics View搭建了一个最简单的应用。运行这个程序来看结果:
第一张图是Graphics View的,第二个是DrawApp的。虽然这两个直线是同样的坐标,但是,DrawApp按照原始坐标绘制出了直线,而Graphics View则按照坐标绘制出直线之后,自动将直线居中显示在view视口。你可以通过拖动Graphics View来看直线是一直居中显示的。
这里仅仅是一个很简单的对比,不过你已经可以看到Graphics View功能的强大。仅这一个居中的操作,如果你是用QPainter,就需要很大的计算量了!当然,如果你不需要这种居中,Graphics View也是可以像QPainter绘制的一样进行显示的。

本文出自 “豆子空间 ” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/241186

分享到:
评论

相关推荐

    QT图形视图框架(The Graphics View Framework)详细介绍

    详解介绍Qt中视图框架机制及场景中主要的常用函数作用及用法,是学习者可以对Qt的场景视图有深入的了解。

    Qt图片浏览器 --基于Qt的Graphics View Framework

    Graphics View Framework、Qt、多媒体、图片浏览器

    QT学习之路2 (1~82篇)

    30. Graphics View Framework 31. 贪吃蛇游戏(1) 32. 贪吃蛇游戏(2) 33. 贪吃蛇游戏(3) 34. 贪吃蛇游戏(4) 35. 文件 36. 二进制文件读写 37. 文本文件读写 38. 存储容器 39. 遍历容器 40. 隐式数据共享 41. ...

    《Qt 学习之路 2》

    30 Graphics View Framework 31 贪吃蛇游戏(1) 32 贪吃蛇游戏(2) 33 贪吃蛇游戏(3) 34 贪吃蛇游戏(4) 35 文件 36 二进制文件读写 37 文本文件读写 38 存储容器 39 遍历容器 40 隐式数据共享 41 ...

    Qt学习之路2 (基于Qt5.0.1共58章)

    30. Graphics View Framework 31. 贪吃蛇游戏(1) 32. 贪吃蛇游戏(2) 33. 贪吃蛇游戏(3) 34. 贪吃蛇游戏(4) 35. 文件 36. 二进制文件读写 37. 文本文件读写 38. 存储容器 39. 遍历容器 40. 隐式数据共享 41. ...

    Qt Graphic-View框架学习代码示例

    Graphics View Framework 提供了一个强大且灵活的工具集,用于创建可交互的 2D 图形界面,并且支持丰富的图形操作和事件处理。无论是创建游戏、数据可视化还是绘制图表,Graphics View Framework 都能够满足各种需求...

    使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面

    Qt框架为我们提供了一种强大而灵活的方式来创建各种图形界面,而QML(Qt Meta-Object Language)是Qt的一部分,用于设计和构建现代、响应式的用户界面。本文将介绍如何在QML中使用图形视图框架,以创建交互式的图形...

    使用qt界面库制作的游戏(潜艇大战)

    使用QT界面库制作的游戏源代码。 README: The animation framework aims to ...the Graphics View framework. Documentation for these examples can be found via the Examples link in the main Qt documentation.

    Qt做的简单的贪吃蛇游戏

    ,开发一个贪吃蛇游戏。游戏很简单,相信大家都有见过,多多少...我们在实现这个贪吃蛇游戏时,会利用到事件系统、Graphics View Framework、QPainter 等相关内容,也会了解到一个游戏所具有的一些特性,比如游戏循环等

    Qt图形视图框架详解

    介绍Qt中的Graphics View Framework,涉及View、Scene、Item的关系,如何自定义QGraphicsItem、处理Item之间的关联、如何布局及定义自己的布局Item、如何变幻Item、如何应用动画、如何处理拖放、如何给Item应用图形...

    Qt项目实战之网络电子白板

    本课程使用Qt技术实现了网络电子白板,支持直线、矩形、椭圆、三角形、涂鸦等图形元素。...服务器端使用Qt Network开发,客户端使用Qt Network和Qt Graphics View Framework开发,数据传输使用JSON数据格式。

    贪吃蛇Demo

    我们在实现这个贪吃蛇游戏时,会利用到事件系统、Graphics View Framework、QPainter 等相关内容,也会了解到一个游戏所具有的一些特性,比如游戏循环等,在 Qt 中如何体现出来。当然,最重要的是,通过一个相对较大...

    ZendFramework中文文档

    1. Introduction to Zend Framework 1.1. 概述 1.2. 安装 2. Zend_Acl 2.1. 简介 2.1.1. 关于资源(Resource) 2.1.2. 关于角色(Role) 2.1.3. 创建访问控制列表(ACL) 2.1.4. 注册角色(Role) 2.1.5. 定义访问...

Global site tag (gtag.js) - Google Analytics