详解 QT 中Graphics View柜架 (下篇)

移动开发
Graphics View使用BSP树来提供对item的快速查找,使用这种技术,它可以实时地绘制大规模场景,甚至以百万items计。Graphics View在Qt 4.2中被引用,它替代了它的前辈QCanvas。

QT Graphics View柜架是本文要介绍的内容,本文分为三部分为大家介绍,本篇文章为下篇,想要继续深入了解的请继续关注。参考末尾。本节介绍的是详解 QT Graphics View柜架 (下篇),继续上篇 详解 QT 中Graphics View柜架 (中篇)的内容继续介绍,先来看内容

关键特性

缩放与旋转

QGraphicsView通过QGraphicsView::setMatrix()支持同QPainter一样的仿射变换,通过对一个视图应用变换,你可以很容易地支持普通的导航特性如缩放与旋转。下面是一个例子:

  1. void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)  
  2. {  
  3.  QMimeData *data=new QMimeData;  
  4.  data->setColor(Qt::green);  
  5. QDrag *drag=new QDrag(event->widget());  
  6. drag->setMimeData(data);  
  7. drag->start();  

这些槽应与QToolButtons联接,并使autoRepeat有效。当对视图变换时,QGraphicsView会对视图中心进行校正。

拖拽

因为QGraphicsView继承自QWidget,它也提供了像QWidget那样的拖拽功能,另处,为了方便,Graphics View柜架也为场景,每个item提供拖拽支持。当视图接收到拖拽事件,它可翻译为QGraphicsSceneDragDropEvent,再发送到场景。场景接管这个事件,把它发送到光标下接受拖拽的***个item。

从一个item开始拖拽时,创建一个QDrag对象,传递开始拖拽的那个widget的指针。Items可以同时被多个视图观察,但只有一个视图可以开始拖拽。拖拽在多数情况下是从按下鼠标或是移动鼠标开始的,因此,在 mousePressEvent()或mouseMoveEvent()中,你可以从事件中得到那个原始的widget指针,例如:

  1. void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)  
  2. {  
  3.  QMimeData *data=new QMimeData;  
  4.  data->setColor(Qt::green);  
  5. QDrag *drag=new QDrag(event->widget());  
  6. drag->setMimeData(data);  
  7. drag->start();  

为了在场景中载取拖拽事件,你应重新实现QGraphicsScene::dragEnterEvent()和在QGraphicsItem的子类里任何与你特定场景需要的事件处理器。items也可以通过调用QGraphicsItem::setAcceptDrops()获得拖拽支持,为了处理将要进行的拖拽,你需要重新实现QGraphicsItem::dragEnterEvent(),QGraphicsItem::dragMoveEvent(),QGraphicsItem::dragLeaveEvent()和QGraphicsItem::dropEvent()。

光标与工具提示

像QWidget一样,QGraphicsItem也支持光标(QgraphicsItem::setCursor)与工具提示(QGraphicsItem::setToolTip())。当光标进入到item的区域,光标与工具提示被QGraphicsView激活(通过调用QGraphicsItem::contains()检测)。你也可以直接在视图上设置一个缺省光标(QGraphicsView::setCursor)。

动画

Graphics View支持几种级别的动画。你可以很容易地通过把QGraphicsItemAnimatoin与你的item联结来

装配出动画路径,这允许以时间线来控制动画,在所有平台上以稳定的速率运作。QGraphicsItemAnimation允许你为item的位置,旋转,缩放,剪切,变换等产生一条路径,动画可以用QSlider来控制,或更为普遍使用的QTimeLine。

另一种是从QObject和QGraphicsItem继承,item可以设置自己的定时器,以在QObject::timeEvent()中增加步进的方式来控制动画。

第三种,是通过调用QGraphicsScene::advance()来推进场景,它又依次调用QGraphicsItem::advance().

OpenGL渲染

为了使用OpenGL渲染,你要设置一个新的QGLWidget作为QGraphicsView的视口:QGraphicsView::setViewPort()。假如你让OpenGL提供反锯齿功能,你需要OpenGL采样缓冲支持。

  1. QGraphicsView view(&scene);  
  2. view.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))); 

Item组

通过把一个item做为另一个item的孩子,你可以得到item组的大多数本质特性:这些items会一起移动,所有变换

会从父到子传递。QGraphicsItem也可以为它的孩子处理所有的事件,这样就允许以父亲代表它所有的孩子,可以有效地把所有的items看作一个整体。

另外,QGraphicsItemGroup是一个特殊的item,它既对孩子事件进行处理又有一个接口把items从一个组中增加和删除。把一个item加到

QGraphicsItemGroup仍会保留item的原始位置与变换,而给一个item重新指定父item则会让item根据其新的父亲重新定位。可以用QGraphicsScene::createItemGroup()建组。

小结:详解 QTGraphics View柜架 (下篇)的内容介绍完了,希望本篇文章对你有所帮助!更所相关内容请参考编辑推荐。

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-06-30 10:09:26

QT Graphics View

2011-06-30 10:22:48

QT Graphics View

2011-06-17 09:58:26

Qt Chapter QObject

2011-06-17 10:19:11

Qt QWidge QSetting

2011-07-05 18:40:19

QT 信号 机制

2011-06-24 16:50:06

QT 框架 OpenCV

2011-06-23 18:16:59

Qt Qtopia

2011-07-01 14:20:59

Qt 事件

2011-06-24 11:12:39

Qt 多线程 线程

2011-06-14 11:48:38

Webkit QT

2011-06-17 17:16:01

Qt Eclipse Linux

2011-06-17 13:39:47

Qt 文件

2011-06-27 13:49:43

Qt 数据库 QSqlQueryM

2011-06-30 16:08:05

Qt 字库 QPF

2010-05-18 13:53:34

Subversion插

2011-06-24 09:13:30

QT SDL

2011-06-27 10:28:45

Qt 网络 TCP

2011-06-21 15:58:20

Qt 数据库

2011-06-22 16:08:40

Qt 多线程 事件循环

2011-06-24 14:17:58

Qt 容器类 QVector
点赞
收藏

51CTO技术栈公众号