QGraphicsScene简单举例和深入分析

1.概要

QGraphicsScene是Qt图形框架中的一个重要类,它提供了一个可以容纳和管理大量2D图形项(QGraphicsItem)的场景

2.内容

1.QGraphicsScene

QGraphicsScene是Qt图形框架中的一个重要类,它提供了一个可以容纳和管理大量2D图形项(QGraphicsItem)的场景。以下是对QGraphicsScene的详细介绍:

基本功能与特性

  • 图形项管理:QGraphicsScene可以管理多个QGraphicsItem对象,支持添加、移除和操作图形项。这些图形项可以是任意用户自定义的QGraphicsItem的子类对象,也可以是Qt内置的图形项类对象。
  • 坐标系统:QGraphicsScene使用自己的坐标系统,与窗口或视图的坐标系统分开。这使得在场景中放置和移动图形项更加灵活。
  • 事件处理:QGraphicsScene能够处理鼠标事件、键盘事件等,可以捕获这些事件并将它们传递给相应的图形项进行处理。
  • 渲染:QGraphicsScene负责管理图形项的绘制,可以将图形项渲染到相关的视图(QGraphicsView)上。
  • 选择和焦点:QGraphicsScene支持图形项的选择和焦点管理,可以通过选择和操作图形项来实现交互功能。
  • 交互:QGraphicsScene可以处理图形项之间的交互,例如碰撞检测、拖放等。
  • 优化:QGraphicsScene实现了一些优化机制,可以提高绘制性能,特别是在处理大量图形项时。

成员函数与属性

  • 构造函数:QGraphicsScene提供了多个构造函数,允许用户根据需要创建具有指定大小、边界矩形或父对象的场景。
  • 图形项管理函数:如addItem()、removeItem()等,用于在场景中添加或移除图形项。
  • 事件处理函数:如mousePressEvent()、keyPressEvent()等,用于处理鼠标和键盘事件。
  • 属性:如backgroundBrush()、bspTreeDepth等,用于设置场景的背景画刷、二叉空间分区树深度等属性。

使用示例

以下是一个简单的使用示例,演示了如何创建QGraphicsScene、添加图形项并将其显示在QGraphicsView中:

#include <QApplication>  
#include <QGraphicsView>  
#include <QGraphicsScene>  
#include <QGraphicsRectItem>  
  
int main(int argc, char *argv[]) {  
    QApplication app(argc, argv);  
  
    // 创建场景  
    QGraphicsScene scene;  
  
    // 在场景中添加一个矩形图形项  
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100, QPen(Qt::black), QBrush(Qt::blue));  
  
    // 创建视图并将场景设置给视图  
    QGraphicsView view(&scene);  
  
    // 显示视图  
    view.show();  
  
    return app.exec();  
}

运行效果:

在这个示例中,我们创建了一个QGraphicsScene对象,并在其上添加了一个蓝色填充黑色边框的矩形。然后我们将这个场景设置为QGraphicsView的内容,并展示了该视图。这样,用户就能通过视图看到并可能与场景中的图形项进行交互。

场景与视图的关系

QGraphicsScene与QGraphicsView是Qt框架中用于创建和管理2D图形界面的重要工具。QGraphicsScene作为图形项的容器,负责管理图形项的布局、渲染、事件处理等。而QGraphicsView则用于显示QGraphicsScene的内容,并提供缩放、旋转等视图变换功能。它们通过提供强大的图形项管理、渲染、交互和优化能力,使得开发者可以轻松地构建具有丰富视觉效果和用户交互功能的应用程序。

综上所述,QGraphicsScene是Qt中用于管理2D图形项的核心类,它提供了丰富的功能和灵活的接口,使得开发者能够方便地创建复杂的2D图形界面并实现各种交互效果和动画。

 2.QGraphicsScene的构成

QGraphicsScene是Qt中用于管理2D图形项(QGraphicsItem)的场景类,它充当了图形项的容器,负责管理图形项的布局、渲染、事件处理等。QGraphicsScene可以看作是一个虚拟的画布,上面可以放置多个图形项,并且可以对这些图形项进行管理和操作。以下是QGraphicsScene的主要构成部分:

一、基本构成

  • 图形项管理:QGraphicsScene可以管理多个QGraphicsItem对象,您可以在场景中添加、移除和操作这些图形项。
  • 坐标系统:QGraphicsScene使用自己的坐标系统,与窗口或视图的坐标系统分开。这使得在场景中放置和移动图形项更加灵活。
  • 事件处理:QGraphicsScene能够处理鼠标事件、键盘事件等,可以捕获这些事件并将它们传递给相应的图形项进行处理。
  • 渲染:QGraphicsScene负责管理图形项的绘制,可以将图形项渲染到相关的视图(QGraphicsView)上。
  • 选择和焦点:QGraphicsScene支持图形项的选择和焦点管理,可以通过选择和操作图形项来实现交互功能。
  • 交互:QGraphicsScene可以处理图形项之间的交互,例如碰撞检测、拖放等。
  • 优化:QGraphicsScene实现了一些优化机制,可以提高绘制性能,特别是在处理大量图形项时。

二、层次结构

QGraphicsScene分为3层:

  • 图形项层(ItemLayer):场景通过调用虚函数drawItems()来渲染的所有图形项在此层中。图形项层绘制在背景层之后,但在前景层之前。
  • 前景层(ForegroundLayer):场景通过调用虚函数drawForeground()在此层中渲染场景的前景。前景层绘制在所有层的最后。
  • 背景层(BackgroundLayer):场景通过调用虚函数drawBackground()在此层中渲染场景的背景。首先绘制的是背景层。

三、常用函数与属性

  • 构造函数:QGraphicsScene提供了多个构造函数,允许用户根据需要创建具有指定大小、边界矩形或父对象的场景。
  • 添加与移除图形项:通过addItem()和removeItem()函数可以向场景中添加或移除图形项。
  • 设置场景矩形:setSceneRect()函数用于设置场景的矩形区域,这影响场景项的索引和可见性。
  • 事件处理函数:QGraphicsScene提供了多个事件处理函数,如mousePressEvent()、keyPressEvent()等,用于处理来自鼠标和键盘的事件。
  • 坐标转换函数:mapToScene()和mapFromScene()函数用于在视图坐标和场景坐标之间进行转换。
  • 索引算法:QGraphicsScene支持两种不同的索引算法(ItemIndexMethod),分别是BSP树索引(BspTreeIndex)和无索引(NoIndex),用户可以根据需要选择合适的索引算法以提高图形项的查找效率。
  • 背景与前景画刷:backgroundBrush和foregroundBrush属性分别用于设置场景的背景和前景画刷,可以自定义场景的背景和前景样式。
  • 最小渲染尺寸:minimumRenderSize属性定义了场景在渲染时忽略的最小尺寸图形项,这有助于提高渲染性能。

四、信号与槽

  • changed():当场景内容发生变化时发出此信号。
  • focusItemChanged():当场景的焦点项发生变化时发出此信号。
  • selectionChanged():当场景的选择发生变化时发出此信号。

综上所述,QGraphicsScene是Qt图形视图框架中的一个核心类,它提供了丰富的功能和灵活的接口来管理和呈现2D图形项。通过QGraphicsScene,开发者可以方便地创建复杂的2D图形界面并实现各种交互效果和动画。

2.QGraphicsScene构成 

QGraphicsScene作为Qt图形视图框架中的核心类,其构成主要包括以下几个方面:

1. 场景(Scene)

  • 基本概念:QGraphicsScene提供了一个抽象的管理图形项的容器。它是不可见的,但用于存储和管理场景中的所有图形项(QGraphicsItem)。

  • 功能

    • 提供用于管理大量图形项的高速接口函数。
    • 传播事件到每个图形项,并管理项目之间的传播。
    • 管理图形项的状态,如选择和焦点处理。
    • 提供无变换的渲染功能,主要用于打印等场景。

2. 图形项(Item)

  • 基本概念:QGraphicsItem是所有图形项的基类,表示场景中的具体图形元素。这些图形项可以是基本形状(如矩形、椭圆、线条)、图片、文本,也可以是自定义的图形元素。

  • 功能

    • 每个图形项都有自己的位置、大小、旋转和变换等属性。
    • 图形项可以处理鼠标事件、键盘事件等,实现与用户的交互。
    • 支持分组和父子关系,可以通过QGraphicsItemGroup进行分组管理。

3. 事件处理

  • 基本概念:QGraphicsScene能够捕获并处理来自鼠标和键盘的事件,然后将这些事件分发给相应的图形项。

  • 功能

    • 支持鼠标事件响应,包括鼠标按下、移动、释放和双击事件,以及鼠标悬停事件、滚轮事件和上下文菜单事件。
    • 支持键盘输入焦点和按键事件处理。
    • 提供了拖拽事件处理函数,支持拖放操作。

4. 渲染与图层

  • 基本概念:QGraphicsScene负责图形项的渲染,并提供了图层的概念来管理不同层次的绘制顺序。

  • 功能

    • 场景分为三层:背景层(BackgroundLayer)、图形项层(ItemLayer)和前景层(ForegroundLayer)。绘制顺序总是从背景层开始,然后是图形项层,最后是前景层。
    • 可以使用QBrush进行填充背景层和前景层,也可以通过重新实现drawBackground()和drawForeground()函数来实现自定义的背景和前景。

5. 坐标系统

  • 基本概念:QGraphicsScene使用自己的坐标系统,与窗口或设备的像素坐标系统分离。

  • 功能

    • 这使得在不同分辨率和平台上进行绘制时,不需要关心像素大小和缩放问题。
    • 提供了方便的函数来在不同坐标系之间进行转换,如mapToScene()和mapFromScene()。

6. 索引与查找

  • 基本概念:QGraphicsScene提供了索引算法来加速图形项的查找过程。

  • 功能

    • 支持两种索引算法:BspTreeIndex(二进制空间分区树算法)和NoIndex(不保存图形项索引)。
    • 提供了items()和itemAt()等函数来快速查找场景中的图形项。

7. 其他特性

  • 选择与焦点:支持图形项的选择和焦点处理,可以通过设置选择模式和选择项的属性来实现单选、多选或不可选中的效果。
  • 动画效果:支持对图形项应用动画效果,可以实现平移、旋转、缩放等动态效果。
  • 信号与槽机制:通过信号与槽机制与其他Qt组件进行通信,以实现与其他组件的交互和数据传输。

综上所述,QGraphicsScene的构成主要包括场景、图形项、事件处理、渲染与图层、坐标系统、索引与查找以及其他特性等方面。这些构成部分共同为开发者提供了一个强大的2D图形视图框架,用于创建各种图形化应用程序。

3.QGraphicsScene的继承关系 

QGraphicsScene在Qt框架中的继承关系相对简单且明确。以下是对QGraphicsScene继承关系的详细解释:

核心继承关系

  • QGraphicsScene 直接继承自 QObject

QObject的作用

QObject是Qt框架中的一个核心基类,为对象提供了信号与槽机制、对象树管理、对象属性系统以及事件处理等核心功能。通过继承QObject,QGraphicsScene获得了这些基础功能,并能够与其他Qt对象进行通信和事件处理。

QGraphicsScene的特性

  • 图形项管理:QGraphicsScene作为一个容器,专门用于存储和管理QGraphicsItem对象。这些图形项可以是基本的形状、文本、图片,也可以是用户自定义的图形元素。
  • 事件处理:QGraphicsScene能够捕获来自QGraphicsView的事件,并将这些事件分发到相应的图形项进行处理。
  • 渲染与图层:QGraphicsScene负责图形项的渲染,并支持多层绘制(如背景层、图形项层和前景层),以实现更复杂的视觉效果。
  • 索引与查找:为了高效地管理大量图形项,QGraphicsScene提供了索引算法来加速图形项的查找过程。

继承关系带来的优势

通过继承QObject,QGraphicsScene获得了Qt框架提供的丰富功能,如信号与槽机制、对象属性系统等。这些功能为QGraphicsScene提供了强大的扩展性和灵活性,使其能够与其他Qt组件无缝集成,并轻松实现复杂的图形界面交互效果。

综上所述,QGraphicsScene通过继承QObject,不仅获得了基础的对象管理功能,还结合自身的图形项管理、事件处理、渲染与图层等特性,为开发者提供了一个功能强大且易于使用的2D图形视图框架。

4.QGraphicsScene的常用接口 

QGraphicsScene是Qt图形视图框架中的一个核心类,用于管理图形项并提供场景相关的功能。以下是一些QGraphicsScene的常用接口及其简要说明:

图形项管理

  1. addItem
    • 功能:向场景中添加一个图形项。如果该项在其他场景中,它将会先从旧的场景中删除,再添加到当前场景中。
  2. removeItem
    • 功能:从场景中删除指定的图形项。
  3. addEllipse, addPath, addPixmap, addRect, addPolygon, addText, addWidget
    • 功能:这些接口用于创建并添加特定类型的图形项到场景中,如椭圆、路径、图片、矩形、多边形、文本和窗口小部件。
  4. items
    • 功能:返回场景中所有图形项的列表,或返回与指定点、矩形、多边形或向量路径相交的所有图形项。
  5. itemAt
    • 功能:返回指定位置最顶层的图形项。

场景设置与查询

  1. setSceneRect
    • 功能:手动设置场景的边界。如果没有明确设置,场景将根据其包含的图形项尺寸自动计算边界。
  2. sceneRect
    • 功能:查询场景的边界矩形。

视觉表现

  1. setBackgroundBrush和setForegroundBrush
    • 功能:分别用于设置场景的背景和前景填充色,从而控制场景的视觉表现。
  2. setFont
    • 功能:为场景设置默认的字体,这将影响场景中所有文本项的字体样式。

交互功能

  1. setSelectionArea和clearSelection
    • 功能:setSelectionArea允许你选择场景中特定区域的图形项,而clearSelection则用于清除所有已选中的图形项。
  2. selectedItems
    • 功能:返回当前所有被选中的图形项。
  3. event处理函数
    • 功能:QGraphicsScene能够捕获并处理来自鼠标和键盘的事件,如mousePressEvent、mouseMoveEvent、keyPressEvent等。这些事件通过QGraphicsScene的事件处理机制进行分发,以实现与图形项的交互。
  4. 碰撞检测
    • 功能:虽然直接的碰撞检测接口在QGraphicsScene中并不明显,但你可以通过获取图形项的位置和边界(如使用boundingRect方法),然后手动进行碰撞计算。此外,QGraphicsScene的collidingItems方法可以用于查找与指定图形项碰撞的所有其他图形项。
  5. 拖放功能
    • 功能:QGraphicsScene支持拖放操作,允许用户拖动图形项并放置到其他位置或与其他图形项进行交互。为了实现拖放功能,你可以重写dragEnterEvent、dragMoveEvent和dropEvent等方法来处理拖放事件。

渲染与输出

  1. render
    • 功能:允许你将场景的部分或全部内容渲染到一个绘图设备中,如QPixmap、QPrinter等。

这些接口使得QGraphicsScene成为Qt图形框架中一个强大而灵活的工具,能够支持复杂的2D图形界面和丰富的交互效果。请注意,以上列举的接口可能不是全部,建议查阅Qt官方文档以获取最全面和最新的信息。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值