Graphics View Framework

Graphics View Framework


Graphics View 提供了一个用于管理大量定制的2D 图形项目并与之交互的表层,以及一个用于可视化这些item的Widget,并支持缩放和旋转。

该框架包含一个事件传播架构,该架构允许对scene 中的item 进行双精度交互能力。item 可以处理按键事件,鼠标按下、移动、释放和双击事件,还可以跟踪鼠标的移动事件。

The Graphics View Architecture

Graphics View 提供一种基于 item 的方法来进行 model-view 编程,非常类似 QTableViewQTreeViewQListView。多个视图可以观察一个场景,并且该场景包含各种几何形状的 item。

Scene

QGraphicsScene 提供了图形视图场景,这个场景有以下责任:

  • 提供用于管理大量项目的快速界面
  • 将事件传播到每个 item
  • 管理 item 的状态,例如选中和焦点处理
  • 提供未转换的渲染功能

scene用作 QGraphicsItem对象的容器,通过 QGraphicsScene::addItem 将 item添加到场景中。

View

QGraphicsView 提供了视图部件,该部件可将场景的内容可视化。你可以将多个视图附加到同一个场景,以在同一个数据集合中提供多个视图窗口。View widget是一个滚动区域,并提供用于在大型场景中导航的滚动条。该视图从键盘和鼠标接受事件,并将其转换为场景事件(将事件发送到场景之前,将其转换为场景坐标)。

使用QGraphicsView::transform可变换矩阵,可以变换场景的坐标系。这可实现高级导航功能,例如旋转和缩放。为了方便,QGraphicsView还提供了用于在视图和场景坐标之间进行转换的函数QGraphicsView::mapToScene()和QGraphicsView::mapFromScene()

Item

QGraphicsItem 是场景中图形项的基类。Graphics View 为典型形状提供了几个标准项,例如矩形,椭圆和文本项,但是在编写自定义项时,需要使用 QGraphicsItemQGraphicsItem支持以下功能:

  • 鼠标按下、移动、释放和双击事件,以及鼠标悬停事件,滚轮事件和上下文菜单事件
  • 键盘输入焦点和按键事件
  • 拖放
  • 通过父子关系以及 QGraphicsItemGroup进行分组
  • 碰撞检测

item 位于局部坐标系中,并且像 QGraphicsView一样,它提供了许多用于在 项目和 场景 之间以及 项目与 项目 之间映射坐标的功能。而且,像 QGraphicsView一样,它可以使用矩阵QGraphicsItem::transform()变换其坐标系。这对旋转和缩放单个 项目 很有用。

自定义item

要编写自己的图像 item ,首先创建 QGraphicsItem的子类,然后实现两个纯虚函数boudingRect返回该 item 绘制区域的估计值和paint 实现绘画的内容。
重载shape则提供了 item 形状的准确轮廓。例如:

class Food : public QGraphicsItem
{
    public:
    QRectF Food::boundingRect() const
    {
        return QRectF(-TILE_SIZE, -TILE_SIZE,
                      TILE_SIZE * 2, TILE_SIZE * 2);
    }

    void Food::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
    {
        painter->setRenderHint(QPainter::Antialiasing);
        painter->fillPath(shape(), Qt::red);
    }

    QPainterPath Food::shape() const
    {
        QPainterPath p;
        p.addEllipse(QPointF(TILE_SIZE / 2, TILE_SIZE / 2), FOOD_RADIUS, FOOD_RADIUS);
        return p;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值