QT QGraphicsScene类介绍
分别介绍了以下内容:
- 类说明
- 公共属性
- 公共函数
- 设置相关的函数
- 槽函数
- 信号量
- Event事件
1.类说明
QGraphicsScene
是Qt中用于管理2D图形项(QGraphicsItem
)的场景类。它充当了图形项的容器,负责管理图形项的布局、渲染、事件处理等。QGraphicsScene
可以看作是一个虚拟的画布,上面可以放置多个图形项,并且可以对这些图形项进行管理和操作。
以下是QGraphicsScene
的一些主要特点和功能:
-
图形项管理:
QGraphicsScene
可以管理多个QGraphicsItem
对象,您可以在场景中添加、移除和操作这些图形项。 -
坐标系统:
QGraphicsScene
使用自己的坐标系统,与窗口或视图的坐标系统分开。这使得在场景中放置和移动图形项更加灵活。 -
事件处理:
QGraphicsScene
能够处理鼠标事件、键盘事件等,可以捕获这些事件并将它们传递给相应的图形项进行处理。 -
渲染:
QGraphicsScene
负责管理图形项的绘制,可以将图形项渲染到相关的视图(QGraphicsView
)上。 -
选择和焦点:
QGraphicsScene
支持图形项的选择和焦点管理,可以通过选择和操作图形项来实现交互功能。 -
交互:
QGraphicsScene
可以处理图形项之间的交互,例如碰撞检测、拖放等。 -
优化:
QGraphicsScene
实现了一些优化机制,可以提高绘制性能,特别是在处理大量图形项时。
通过使用QGraphicsScene
,您可以方便地创建复杂的2D图形界面,实现各种交互效果和动画。它为Qt的图形框架提供了一个强大的基础,使得开发者可以更轻松地构建具有丰富视觉效果的用户界面。
2.公共属性
backgroundBrush()
属性 获取背景画刷
backgroundBrush 是 QGraphicsScene 类中用于设置场景背景画刷(brush)的属性。背景画刷定义了场景的背景样式,可以是颜色、渐变、纹理等。
bspTreeDepth()
属性 获取树深度
bspTreeDepth
是 QGraphicsScene
类中用于设置二叉空间分区树(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::QGraphicsScene
是QGraphicsScene
类的构造函数,用于创建一个新的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::~QGraphicsScene
是QGraphicsScene
类的析构函数,用于释放QGraphicsScene
对象所占用的资源。析构函数在对象被销毁时自动调用,用于执行清理操作,例如释放内存、关闭文件等。
在Qt中,QGraphicsScene
的析构函数通常会在对象不再需要时被调用,以确保资源得到正确释放,避免内存泄漏和其他问题。当删除QGraphicsScene
对象时,其析构函数会被自动调用。
在析构函数中,通常会执行一些清理工作,例如删除场景中的所有图形项、断开与其他对象的连接等。如果QGraphicsScene
对象包含了其他动态分配的资源,析构函数也应该负责释放这些资源,以避免资源泄漏。
如果您需要在QGraphicsScene
对象被销毁时执行特定的清理操作,可以在析构函数中添加相应的代码。Qt会确保在对象销毁时自动调用析构函数,因此您无需手动调用它。
总之,QGraphicsScene::~QGraphicsScene
是QGraphicsScene
类的析构函数,用于在对象销毁时执行清理操作,确保资源的正确释放。
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())
函数参数含义:
x1
、y1
:直线的起点坐标。x2
、y2
:直线的终点坐标。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
,通过一系列的 moveTo
和 lineTo
操作来定义路径的形状,最后通过 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>
#<