Qt QGraphicsView模块简介
1.组成
QGraphicsView
模块主要涉及到3个类:
QGraphicsView;
QGraphicsItemScene;
QGrahpicsItem;
QGraphicsView
用于展示;
QGraphicsItemScene
用于场景管理,碰撞检测;
QGrahpicsItem
是场景下的被控图形单元。
1.1.QGraphicsView
由3部分组成:视口,水平滚动栏,垂直滚动栏。三者的指针可以分别通过成员函数
viewport()
,
horizontalScrollBar()
,
verticalScrollBar()
获得。其中,视口用于展示场景下的内容,提几个重要接口:
//关联QGraphicsView和QGraphicsScene
setScene();
//设置显示的scene区域
void setSceneRect(const QRectF &rect);
1.2.QGraphicsItemScene
用于设置场景属性,管理场景下的图元(BSP算法),实现碰撞检测。涉及到的几个重要接口如下:
//设置Scene大小
void setSceneRect(const QRectF &rect);
//获取当前Scene的View
QList<QGraphicsView *> views() const;
//获取所有图元
QList<QGraphicsItem *> items(Qt::SortOrder order = Qt::DescendingOrder) const;
//bsp树深度
void setBspTreeDepth(int depth);
//碰撞检测
QList<QGraphicsItem *> QGraphicsItemScene::collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const;
1.3.QGraphicsItem
主要用于绘制图元,设置图元绘图区大小和设置碰撞检测包围盒大小。涉及到的几个重要接口如下,需要用户重载这些函数:
// 绘制图元
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget*widget);
// 设置绘图区域大小
virtual QRectF boundingRect() const;
// 设置碰撞检测包围盒
virtual QPainterPath shape() const;
2.坐标系统
涉及到3个坐标系:视图坐标系,场景坐标系和图元坐标系。三个坐标系之间的转化矩阵如下:
//图元本地坐标系到场景坐标系的变换矩阵
QTransform QGraphicsItem::sceneTransform() const;
//视口坐标系到场景坐标系的变换矩阵
QTransform QGraphicsView::transform() const;
除此之外,Qt还提供了许多形如
mapFrom*
和
mapTo*
接口,这些接口同样用于坐标系转化。
3.事件传递
先传递给
QGraphicsView
,再传给
QGraphicsItemScene
,最后传递给
QGraphicsItem
。其传递流程呈串状结构,如图所示:
以画图事件为例,其流程如下:
//传给QGraphicsView
void QGraphicsView::event(QEvent *event);
void QGraphicsView::paintEvent(QPaintEvent *event);
//传给QGraphicsItemScene