QT 笔记 QGraphicsScene介绍

本文详细介绍了QT中QGraphicsScene类,它是管理2D图形项的场景类,充当图形项容器。文中阐述了其公共属性,如背景画刷、树深度等;介绍了公共函数、设置相关函数、槽函数、信号量及Event事件等内容,可助开发者构建丰富视觉效果的用户界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QT QGraphicsScene类介绍
分别介绍了以下内容:

  1. 类说明
  2. 公共属性
  3. 公共函数
  4. 设置相关的函数
  5. 槽函数
  6. 信号量
  7. Event事件

1.类说明

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

以下是QGraphicsScene的一些主要特点和功能:

  1. 图形项管理QGraphicsScene可以管理多个QGraphicsItem对象,您可以在场景中添加、移除和操作这些图形项。

  2. 坐标系统QGraphicsScene使用自己的坐标系统,与窗口或视图的坐标系统分开。这使得在场景中放置和移动图形项更加灵活。

  3. 事件处理QGraphicsScene能够处理鼠标事件、键盘事件等,可以捕获这些事件并将它们传递给相应的图形项进行处理。

  4. 渲染QGraphicsScene负责管理图形项的绘制,可以将图形项渲染到相关的视图(QGraphicsView)上。

  5. 选择和焦点QGraphicsScene支持图形项的选择和焦点管理,可以通过选择和操作图形项来实现交互功能。

  6. 交互QGraphicsScene可以处理图形项之间的交互,例如碰撞检测、拖放等。

  7. 优化QGraphicsScene实现了一些优化机制,可以提高绘制性能,特别是在处理大量图形项时。

通过使用QGraphicsScene,您可以方便地创建复杂的2D图形界面,实现各种交互效果和动画。它为Qt的图形框架提供了一个强大的基础,使得开发者可以更轻松地构建具有丰富视觉效果的用户界面。

2.公共属性

backgroundBrush() 属性 获取背景画刷

backgroundBrush 是 QGraphicsScene 类中用于设置场景背景画刷(brush)的属性。背景画刷定义了场景的背景样式,可以是颜色、渐变、纹理等。

bspTreeDepth() 属性 获取树深度

bspTreeDepthQGraphicsScene 类中用于设置二叉空间分区树(Binary Space Partitioning Tree)深度的属性。二叉空间分区树是一种用于优化场景中图形项渲染的数据结构,可以提高图形项的渲染效率。

原型

void QGraphicsScene::setBspTreeDepth(int depth)
int QGraphicsScene::bspTreeDepth() const

函数参数含义

  • depth:要设置的二叉空间分区树的深度。深度值越大,分区越精细,但也会增加计算开销。

说明
二叉空间分区树是一种将场景划分为不重叠的区域,以便更有效地管理和渲染图形项的数据结构。通过调整二叉空间分区树的深度,可以在渲染图形项时平衡性能和精度之间的需求。

举例

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QApplication>

int main(int argc, char *argv[]) {
   
   
    QApplication app(argc, argv);

    // 创建场景和视图
    QGraphicsScene scene;
    QGraphicsView view(&scene);

    // 设置二叉空间分区树的深度为3
    scene.setBspTreeDepth(3);

    // 添加一些图形项到场景中(这里省略)

    // 设置视图大小并显示
    view.setScene(&scene);
    view.show();

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsScene 对象 scene 和一个 QGraphicsView 对象 view,然后使用 setBspTreeDepth() 函数将二叉空间分区树的深度设置为3。通过调整深度,可以根据需要平衡渲染性能和精度。

focusOnTouch() 属性 是否获得触摸焦点

此属性用于保存项目在接收触摸开始事件时是否获得焦点。
通常的行为是仅在单击项时转移焦点。触摸板上的点击通常被操作系统解释为等同于鼠标点击,从而生成一个合成的点击事件作为响应。但是,至少在macOS上可以配置此行为。
默认情况下,QGraphicsScene也会在触摸触控板或类似设备时转移焦点。如果操作系统被配置为在点击触控板时不生成合成的鼠标点击,这就令人惊讶了。如果操作系统确实在点击触控板时生成合成的鼠标点击,那么启动触摸手势的焦点转移就没有必要了。
关闭focusOnTouch后,QGraphicsScene的行为与macOS上的预期一致。

QFont font () 属性 场景的字体

此属性保存场景的默认字体
此属性提供场景的字体。场景字体默认为QApplication::font,并从QApplication::font解析其所有条目。
如果场景的字体发生变化,无论是直接通过setFont()还是当应用程序字体发生变化时间接发生变化,QGraphicsScene首先向自己发送一个FontChange事件,然后将FontChange事件发送给场景中的所有顶级小部件项。这些项通过将它们自己的字体解析到场景来响应,然后通知它们的子节点,这些子节点再通知它们的子节点,以此类推,直到所有小部件项都更新了它们的字体。
改变场景字体,(直接或间接地通过QApplication::setFont(),)自动调度重新绘制整个场景。
QBrush

QBrush foregroundBrush() 属性 前景的笔刷

这个属性保存场景的前景笔刷。
更改此属性以将场景的前景设置为不同的颜色,渐变或纹理。
前景画在项目之后(在上面)。默认的前景刷是Qt::NoBrush(即前景不绘制)。

bool hasFocus() 属性 是否有焦点

如果场景有焦点则返回true;否则返回false。如果场景有焦点,它将把关键事件从QKeyEvent转发到任何有焦点的项目。

qreal height() 属性 场景的高

这个方便的函数相当于调用scenRect().height()。

isActive() 属性 活动状态

说明:
QGraphicsScene::isActive() 函数用于检查场景是否处于活动状态。

QGraphicsScene::itemAt

bool QGraphicsScene::isActive() const

函数参数含义:
该函数没有参数。

示例:

// 检查场景是否处于活动状态
if(scene->isActive()) {
   
   
    qDebug() << "Scene is active.";
} else {
   
   
    qDebug() << "Scene is not active.";
}

在这个示例中,我们使用 isActive() 函数来检查场景是否处于活动状态。如果场景处于活动状态,将输出 “Scene is active.”,否则输出 “Scene is not active.”。

qreal minimumRenderSize() 属性 最小视图转换尺寸

此属性保存绘制项必须具有的最小视图转换大小
当渲染场景时,任何被转换为目标视图的宽度或高度小于minimumRenderSize()的项目都不会被渲染。如果一个项目没有被渲染,并且它剪辑了它的子项目,它们也不会被渲染。设置此值可以加快在缩小视图上渲染许多对象的场景的渲染速度。
缺省值为0。如果不设置,或者设置为0或负值,则始终呈现所有项。
例如,如果一个场景由多个视图渲染,其中一个视图充当总览,总是显示所有项目,设置此属性可能特别有用。在具有许多项目的场景中,这样的视图将使用高缩放因子,以便可以显示所有项目。由于缩放,较小的物品只会对最终渲染的场景做出微不足道的贡献。为了避免绘制这些项目并减少渲染场景所需的时间,您可以使用非负值调用setMinimumRenderSize()。
注意:由于太小而没有绘制的项仍然由Items()和itemAt()等方法返回,并参与碰撞检测和交互。建议您将minimumRenderSize()设置为小于或等于1的值,以避免交互式的大型未渲染项。

QRectF sceneRect() 属性 调色板

这个属性保存了场景矩形;场景的边界矩形
场景矩形定义了场景的范围。它主要由QGraphicsView用于确定视图的默认可滚动区域,并由QGraphicsScene用于管理项目索引。
如果未设置,或者设置为空QRectF, scenRect()将返回自场景创建以来场景中所有项目的最大边界矩形(即,当项目添加到场景中或在场景中移动时,矩形会增长,但不会缩小)。

style() 属性 场景的样式

QStyle *QGraphicsScene::style() const

返回场景的样式,如果场景没有被显式地分配样式,则与QApplication::style()相同。

width() 属性 场景的宽度

qreal QGraphicsScene::width() const

返回创景的宽度,相当于调用sceneRect().width()

3.公共函数

QGraphicsScene 构造函数

QGraphicsScene::QGraphicsSceneQGraphicsScene类的构造函数,用于创建一个新的QGraphicsScene对象。这个构造函数有几种不同的重载形式,可以接受不同的参数来初始化场景。

以下是QGraphicsScene::QGraphicsScene构造函数的一种常见形式:

QGraphicsScene::QGraphicsScene(const QRectF &sceneRect, QObject *parent = nullptr)
QGraphicsScene::QGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent = nullptr)
QGraphicsScene::QGraphicsScene(QObject *parent = nullptr)

在这个构造函数中,sceneRect参数指定了场景的矩形范围,即场景的可视区域。parent参数用于指定场景的父对象,如果不需要指定父对象,则可以将其设置为nullptr

除了上述形式,QGraphicsScene::QGraphicsScene构造函数还有其他重载形式,可以根据不同的需求来初始化场景。例如,还有一些构造函数可以接受不同类型的参数,如坐标值、大小等,以便更灵活地创建场景。

在使用QGraphicsScene时,通常会在构造函数中指定场景的大小和父对象(如果需要),然后可以通过调用其他成员函数来添加图形项、处理事件等。QGraphicsScene提供了丰富的功能,可以帮助您管理和操作2D图形项,实现各种交互和动画效果。

~QGraphicsScene 析构函数

[virtual] QGraphicsScene::~QGraphicsScene()

QGraphicsScene::~QGraphicsSceneQGraphicsScene类的析构函数,用于释放QGraphicsScene对象所占用的资源。析构函数在对象被销毁时自动调用,用于执行清理操作,例如释放内存、关闭文件等。

在Qt中,QGraphicsScene的析构函数通常会在对象不再需要时被调用,以确保资源得到正确释放,避免内存泄漏和其他问题。当删除QGraphicsScene对象时,其析构函数会被自动调用。

在析构函数中,通常会执行一些清理工作,例如删除场景中的所有图形项、断开与其他对象的连接等。如果QGraphicsScene对象包含了其他动态分配的资源,析构函数也应该负责释放这些资源,以避免资源泄漏。

如果您需要在QGraphicsScene对象被销毁时执行特定的清理操作,可以在析构函数中添加相应的代码。Qt会确保在对象销毁时自动调用析构函数,因此您无需手动调用它。

总之,QGraphicsScene::~QGraphicsSceneQGraphicsScene类的析构函数,用于在对象销毁时执行清理操作,确保资源的正确释放。

activePanel 活动面板

返回当前活动面板,如果当前没有活动面板,则返回nullptr。

activeWindow() 活动窗口

返回当前活动窗口,如果当前没有活动窗口,则返回nullptr。

addEllipse() 椭圆形状的图形项

说明:
QGraphicsScene::addEllipse()QGraphicsScene 类中的一个函数,用于在场景中添加椭圆图形项。

原型:

QGraphicsEllipseItem * QGraphicsScene::addEllipse(const QRectF & rect, const QPen & pen = QPen(), const QBrush & brush = QBrush())
QGraphicsEllipseItem *QGraphicsScene::addEllipse(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())

函数参数含义:

  • rect:椭圆的边界矩形,指定椭圆的位置和大小。
  • pen:椭圆的边框画笔,用于指定边框的样式、颜色和宽度。默认为 QPen(),即无边框。
  • brush:椭圆的填充刷子,用于指定填充的样式和颜色。默认为 QBrush(),即无填充。

示例:
下面是一个示例,演示如何使用 QGraphicsScene::addEllipse() 函数向场景中添加一个椭圆图形项:

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsEllipseItem>
#include <QApplication>

int main(int argc, char *argv[]) {
   
   
    QApplication app(argc, argv);

    // 创建场景和视图
    QGraphicsScene scene;
    QGraphicsView view(&scene);

    // 创建一个椭圆图形项
    QRectF rect(0, 0, 100, 50); // 椭圆的边界矩形
    QPen pen(Qt::black); // 边框画笔
    QBrush brush(Qt::red); // 填充刷子

    QGraphicsEllipseItem *ellipseItem = scene.addEllipse(rect, pen, brush);

    // 设置视图大小并显示
    view.setScene(&scene);
    view.show();

    return app.exec();
}

在这个示例中,我们首先创建了一个 QGraphicsScene 对象 scene 和一个 QGraphicsView 对象 view。然后,我们定义了椭圆的边界矩形 rect、边框画笔 pen 和填充刷子 brush,并通过调用 scene.addEllipse(rect, pen, brush) 向场景中添加了一个椭圆图形项。最后,将场景设置给视图并显示出来。

通过这种方式,您可以使用 QGraphicsScene::addEllipse() 函数在场景中动态添加椭圆图形项,并根据需要设置其边框、填充等属性。

addItem() 添加图形项

说明:
QGraphicsScene::addItem()QGraphicsScene 类中的一个函数,用于向场景中添加图形项。

原型:

QGraphicsItem * QGraphicsScene::addItem(QGraphicsItem * item)

函数参数含义:

  • item:要添加到场景中的图形项对象。

示例:
下面是一个示例,演示如何使用 QGraphicsScene::addItem() 函数向场景中添加一个自定义图形项:

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QApplication>

int main(int argc, char *argv[]) {
   
   
    QApplication app(argc, argv);

    // 创建场景和视图
    QGraphicsScene scene;
    QGraphicsView view(&scene);

    // 创建一个矩形图形项
    QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 100, 50);
    rectItem->setBrush(Qt::blue); // 设置矩形填充颜色

    // 将矩形图形项添加到场景中
    scene.addItem(rectItem);

    // 设置视图大小并显示
    view.setScene(&scene);
    view.show();

    return app.exec();
}

在这个示例中,我们首先创建了一个 QGraphicsScene 对象 scene 和一个 QGraphicsView 对象 view。然后,我们创建了一个矩形图形项 rectItem,设置了矩形的位置、宽度和高度,以及填充颜色。最后,通过调用 scene.addItem(rectItem) 将矩形图形项添加到场景中,并将场景设置给视图,最终显示出来。

通过类似的方法,您可以使用 QGraphicsScene::addItem() 函数向场景中添加各种类型的图形项,包括矩形、椭圆、文本等,以实现丰富多彩的图形场景。

QGraphicsScene::addLine()QGraphicsScene 类中的一个函数,用于在场景中添加直线图形项。

addLine() 添加直线图形项

说明:
QGraphicsScene::addLine() 函数用于在场景中添加直线图形项。

原型:

QGraphicsLineItem *QGraphicsScene::addLine(const QLineF &line, const QPen &pen = QPen())
QGraphicsLineItem * QGraphicsScene::addLine(qreal x1, qreal y1, qreal x2, qreal y2, const QPen & pen = QPen())

函数参数含义:

  • x1y1:直线的起点坐标。
  • x2y2:直线的终点坐标。
  • pen:直线的画笔,用于指定直线的样式、颜色和宽度。默认为 QPen(),即无边框。

示例:
下面是一个示例,演示如何使用 QGraphicsScene::addLine() 函数向场景中添加一条直线图形项:

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsLineItem>
#include <QApplication>

int main(int argc, char *argv[]) {
   
   
    QApplication app(argc, argv);

    // 创建场景和视图
    QGraphicsScene scene;
    QGraphicsView view(&scene);

    // 添加一条直线图形项
    QGraphicsLineItem *lineItem = scene.addLine(0, 0, 100, 100, QPen(Qt::black));

    // 设置视图大小并显示
    view.setScene(&scene);
    view.show();

    return app.exec();
}

在这个示例中,我们首先创建了一个 QGraphicsScene 对象 scene 和一个 QGraphicsView 对象 view。然后,通过调用 scene.addLine(0, 0, 100, 100, QPen(Qt::black)) 向场景中添加了一条直线图形项,起点坐标为 (0, 0),终点坐标为 (100, 100),并设置了黑色的边框。最后,将场景设置给视图并显示出来。

通过类似的方法,您可以使用 QGraphicsScene::addLine() 函数向场景中添加直线图形项,实现绘制直线的效果。

QGraphicsScene::addPath()QGraphicsScene 类中的一个函数,用于在场景中添加路径图形项。

addPath() 添加路径图形项

说明:
QGraphicsScene::addPath() 函数用于在场景中添加路径图形项。

原型:

QGraphicsPathItem * QGraphicsScene::addPath(const QPainterPath & path, const QPen & pen = QPen(), const QBrush & brush = QBrush())

函数参数含义:

  • path:要绘制的路径。
  • pen:路径的画笔,用于指定路径的边框样式、颜色和宽度。默认为 QPen(),即无边框。
  • brush:路径的填充刷子,用于指定路径的填充样式和颜色。默认为 QBrush(),即无填充。

示例:
下面是一个示例,演示如何使用 QGraphicsScene::addPath() 函数向场景中添加一个自定义路径图形项:

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsPathItem>
#include <QPainterPath>
#include <QApplication>

int main(int argc, char *argv[]) {
   
   
    QApplication app(argc, argv);

    // 创建场景和视图
    QGraphicsScene scene;
    QGraphicsView view(&scene);

    // 创建一个路径
    QPainterPath path;
    path.moveTo(0, 0);
    path.lineTo(50, 0);
    path.lineTo(50, 50);
    path.lineTo(0, 50);
    path.closeSubpath();

    // 添加路径图形项到场景中
    QGraphicsPathItem *pathItem = scene.addPath(path, QPen(Qt::blue), QBrush(Qt::yellow));

    // 设置视图大小并显示
    view.setScene(&scene);
    view.show();

    return app.exec();
}

在这个示例中,我们首先创建了一个 QGraphicsScene 对象 scene 和一个 QGraphicsView 对象 view。然后,我们创建了一个自定义路径 path,通过一系列的 moveTolineTo 操作来定义路径的形状,最后通过 closeSubpath 封闭路径。接着,我们通过调用 scene.addPath(path, QPen(Qt::blue), QBrush(Qt::yellow)) 将路径图形项添加到场景中,并设置了蓝色的边框和黄色的填充。最后,将场景设置给视图并显示出来。

通过类似的方法,您可以使用 QGraphicsScene::addPath() 函数向场景中添加自定义路径图形项,实现绘制各种复杂形状的效果。

addPixmap() 添加像素图形项

说明:
QGraphicsScene::addPixmap() 函数用于在场景中添加像素图形项。

原型:

QGraphicsPixmapItem * QGraphicsScene::addPixmap(const QPixmap & pixmap)

函数参数含义:

  • pixmap:要添加的像素图。

示例:
下面是一个示例,演示如何使用 QGraphicsScene::addPixmap() 函数向场景中添加一个像素图形项:

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsPixmapItem>
#include <QPixmap>
#include <QApplication>

int main(int argc, char *argv[]) {
   
   
    QApplication app(argc, argv);

    // 创建场景和视图
    QGraphicsScene scene;
    QGraphicsView view(&scene);

    // 加载图片
    QPixmap pixmap("image.jpg");

    // 添加像素图形项到场景中
    QGraphicsPixmapItem *pixmapItem = scene.addPixmap(pixmap);

    // 设置视图大小并显示
    view.setScene(&scene);
    view.show();

    return app.exec();
}

在这个示例中,我们首先创建了一个 QGraphicsScene 对象 scene 和一个 QGraphicsView 对象 view。然后,我们加载了一个图片文件 image.jpg,并将其作为 QPixmap 对象 pixmap。接着,通过调用 scene.addPixmap(pixmap) 将像素图形项添加到场景中。最后,将场景设置给视图并显示出来。

addRect() 添加矩形图形项

说明:
QGraphicsScene::addRect() 函数用于在场景中添加矩形图形项。

原型:

QGraphicsRectItem * QGraphicsScene::addRect(const QRectF & rect, const QPen & pen = QPen(), const QBrush & brush = QBrush())
QGraphicsRectItem *QGraphicsScene::addRect(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())

函数参数含义:

  • rect:要绘制的矩形区域,使用 QRectF 类型表示。
  • pen:矩形的画笔,用于指定矩形的边框样式、颜色和宽度。默认为 QPen(),即无边框。
  • brush:矩形的填充刷子,用于指定矩形的填充样式和颜色。默认为 QBrush(),即无填充。

示例:
下面是一个示例,演示如何使用 QGraphicsScene::addRect() 函数向场景中添加一个矩形图形项:

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QRectF>
#include <QPen>
#include <QBrush>
#include <QApplication>

int main(int argc, char *argv[]) {
   
   
    QApplication app(argc, argv);

    // 创建场景和视图
    QGraphicsScene scene;
    QGraphicsView view(&scene);

    // 创建一个矩形
    QRectF rect(0, 0, 100, 50);

    // 添加矩形图形项到场景中
    QGraphicsRectItem *rectItem = scene.addRect(rect, QPen(Qt::red), QBrush(Qt::green));

    // 设置视图大小并显示
    view.setScene(&scene);
    view.show();

    return app.exec();
}

在这个示例中,我们首先创建了一个 QGraphicsScene 对象 scene 和一个 QGraphicsView 对象 view。然后,我们创建了一个矩形 rect,通过指定矩形的左上角坐标、宽度和高度来定义矩形的大小和位置。接着,通过调用 scene.addRect(rect, QPen(Qt::red), QBrush(Qt::green)) 将矩形图形项添加到场景中,并设置了红色的边框和绿色的填充。最后,将场景设置给视图并显示出来。

addSimpleText() 添加简单的文本项

说明:
QGraphicsScene::addSimpleText() 函数用于在场景中添加简单的文本项。

原型:

QGraphicsSimpleTextItem * QGraphicsScene::addSimpleText(const QString & text, const QFont & font = QFont())

函数参数含义:

  • text:要显示的文本内容。
  • font:文本的字体设置,包括字体、大小、粗细等。默认为 QFont(),即使用默认字体设置。

示例:
下面是一个示例,演示如何使用 QGraphicsScene::addSimpleText() 函数向场景中添加一个简单的文本项:

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsSimpleTextItem>
#<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Hwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值