图像视图框架
Qt提供了图形视图框架(Graphics View Framework)、动画框架(The Animation Framework)和状态机框架(The State Machine Framework)来实现更加高级的图形和动画应用。
图形视图框架的结构
使用QGraphicsScene场景、QGraphicsView视图、QGraphicsItem图形项替代以前版本的QCanvas类。
图形项可以处理键盘事件,鼠标的按下、移动、释放和双击事件,跟踪鼠标移动。
场景
QGraphicsScene提供了图形视图框架中的场景,功能有:
- 提供管理大量图形项的高速接口
- 传播事件到每一个图形项
- 管理图形项的状态,例如选择和处理焦点
- 提供无变换的渲染功能,用于打印
- 场景是QGraphicsItem对象的容器
常用函数:
- QGraphicsScene::addItem()将图形项添加到场景中;
- QGraphicsScene::items()返回符合条件的所有图形项;
- QGraphicsScene::itemAt()返回指定点的最上层的图形项;
- QGraphicsScene::RemoveItem()删除一个图形项;
视图
QGraphicsView使场景中的内容可视化;是一个可滚动的区域;
图形项
QGraphicsItem主要支持功能:
- 鼠标按下、移动、释放、双击、悬停、滚轮和右键菜单事件;
- 键盘输入焦点和键盘事件;
- 拖放事件;
- 分组;
- 碰撞检测;
坐标系统
坐标系统有3个:图形项坐标、场景坐标和视图坐标。
场景坐标对应QPainter的逻辑坐标,视图坐标对应设备坐标。
setPos()函数来指定图形项的位置,如果没有指定,则默认出现在父图形项或者场景的原点处。
场景坐标的原点在场景的中心。
视图坐标总在QGraphicsView视口的左上角。
事件处理
图形视图框架中的事件都是先由视图进行接收,然后传递给场景,再由场景传递给相应的图形项。
键盘事件:焦点、QGraphicsScene
图形效果
QGraphicsEffect类。
可以实施在任何一个图形项或者非顶层窗口的任何窗口部件上,只须先创建一个图形效果对象,然后调用setGraphicsEffect()函数来使用这个图形效果即可。停止使用可以使用setEnable(false)函数。
动画
QGraphicsScene::advance()来推动场景。配合QTimer
碰撞检测
- 方法一:重新实现QGraphicsItem::shape()函数来返回图形项准确的形状,然后使用默认的collidesWithItem()函数通过两个图形项形状之间的交集来判断是否发生碰撞。
- 方法二:重新实现collidesWithItem()函数来提供一个自定义的图形项碰撞算法。