问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

QGraphicsScene简单举例和深入分析

创作时间:
作者:
@小白创作中心

QGraphicsScene简单举例和深入分析

引用
CSDN
1.
https://blog.csdn.net/xie__jin__cheng/article/details/143234787

QGraphicsScene是Qt图形框架中的一个重要类,它提供了一个可以容纳和管理大量2D图形项(QGraphicsItem)的场景。本文将详细介绍QGraphicsScene的基本功能、特性、成员函数、使用示例以及与其他组件的关系,帮助开发者更好地理解和使用这个强大的工具。

1. 概要

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图形界面并实现各种交互效果和动画。

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

场景设置与查询

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

视觉表现

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

交互功能

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

渲染与输出

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

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号