QT之QGraphicsScene详细介绍

此篇文章来源于自己在完成一个图片编辑软件而遇到的三个类:QGraphicsScene、QGraphicsPixmapItem、QGraphicsView。此篇文章先介绍QGraphicsScene,另外两个类在其他文章,大家可查看博主其他文章。本人能力有限,大家有任何问题可评论区评论,共同学习,共同进步。

一、QGraphicsItem 介绍

QGraphicsScene 是 Qt GUI 库中的一个核心类,它是 QGraphicsView 的幕后数据模型,用于存储和管理二维图形元素。它可以容纳多种类型的图形项,包括但不限于基本形状(如矩形、圆形等)、图片、文本以及自定义的 QGraphicsItem 子类。

关键特性:

  1. 图形项管理:QGraphicsScene 负责管理其上的所有图形项,这些项可以通过调用 addXXX 方法(如 addRect、addEllipse 等)添加。

  2. 事件处理:场景能捕获并处理来自鼠标和键盘的事件,然后将这些事件分发给相应的图形项,实现交互性。

  3. 选择与拖拽:支持选择一组图形项并通过拖拽进行移动、旋转或缩放。

  4. 搜索与查询:提供了搜索特定区域内的图形项、获取特定图形项的方法,还支持碰撞检测等功能。

  5. 场景更新:当场景内容发生变化时,相关联的 QGraphicsView 将自动进行刷新,以反映最新的场景状态。

使用示例:

#include <QGraphicsScene>
#include <QGraphicsRectItem>

// 创建一个 QGraphicsScene 对象
QGraphicsScene *scene = new QGraphicsScene();

// 在场景中添加一个矩形图形项
QGraphicsRectItem *rect = scene->addRect(0, 0, 100, 100, QPen(Qt::black), QBrush(Qt::blue));

// 设置场景为 QGraphicsView 的可视内容
QGraphicsView *view = new QGraphicsView();
view->setScene(scene);

// 显示视图
view->show();

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

二、成员函数

1、QGraphicsScene::QGraphicsScene(qreal xqreal yqreal widthqreal heightQObject *parent = nullptr)

GraphicsScene::QGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent = nullptr) 是 QGraphicsScene 类的一个构造函数。这个构造函数用来创建一个具有指定大小的新 QGraphicsScene 对象实例。

参数说明:

  • qreal x: 场景左上角的 x 坐标。
  • qreal y: 场景左上角的 y 坐标。
  • qreal width: 场景的宽度。
  • qreal height: 场景的高度。
  • QObject *parent: 指向父对象的指针,默认为 nullptr。如果提供了父对象,那么当父对象被销毁时,该场景也会随之被销毁。

使用此构造函数创建的 QGraphicsScene 初始时会有一个指定大小的区域,这个区域即为场景的可视范围。在 QGraphicsView 中显示这个场景时,它会默认显示这个区域内所包含的所有图形项。

示例代码:

#include <QGraphicsScene>
#include <QGraphicsView>

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

    // 创建一个位于坐标原点,宽高均为 800x600 的 QGraphicsScene
    QGraphicsScene* scene = new QGraphicsScene(0, 0, 800, 600);

    // 创建一个 QGraphicsView 并关联场景
    QGraphicsView* view = new QGraphicsView();
    view->setScene(scene);

    // 显示 QGraphicsView
    view->show();

    return app.exec();
}

在上述示例中,创建了一个从 (0, 0) 点开始,宽 800,高 600 的 QGraphicsScene,并在一个 QGraphicsView 中展示它。

2、QGraphicsScene::QGraphicsScene(const QRectF &sceneRectQObject *parent = nullptr)

QGraphicsScene::QGraphicsScene(const QRectF &sceneRect, QObject *parent = nullptr) 是 QGraphicsScene 类的一个构造函数,用于创建一个新的 QGraphicsScene 对象实例,并初始化其场景区域。

参数说明:

  • const QRectF &sceneRect: 用于指定场景的初始区域,这是一个浮点数矩形结构,包含场景的左上角坐标(x,y)及其宽度和高度。
  • QObject *parent: 可选参数,表示此 QGraphicsScene 对象的父对象,默认为 nullptr。如果设置了父对象,当父对象被销毁时,该场景也将随之被销毁,遵循Qt的父对象子对象管理机制。

使用此构造函数可以方便地根据矩形区域创建场景,适用于需要预设场景大小的情况。

示例代码:

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QRectF>

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

    // 创建一个左上角坐标为 (0, 0),宽高分别为 800 和 600 的 QGraphicsScene
    QRectF sceneRect(0, 0, 800, 600);
    QGraphicsScene* scene = new QGraphicsScene(sceneRect);

    // 创建一个 QGraphicsView 并关联场景
    QGraphicsView* view = new QGraphicsView();
    view->setScene(scene);

    // 显示 QGraphicsView
    view->show();

    return app.exec();
}

在这段代码中,我们创建了一个左上角在 (0, 0),尺寸为 800x600 的 QGraphicsScene,并在一个 QGraphicsView 中显示它。

3、QGraphicsScene::QGraphicsScene(QObject *parent = nullptr)

QGraphicsScene::QGraphicsScene(QObject *parent = nullptr) 是 QGraphicsScene 类的一个构造函数,用于创建一个新的 QGraphicsScene 对象实例。

参数说明:

  • QObject *parent: 可选参数,指向此 QGraphicsScene 对象的父对象,默认值为 nullptr。如果指定了父对象,则此场景将作为父对象的子对象,遵循 Qt 的对象树管理和内存管理机制,即当父对象析构时,此场景也会自动析构。

这个构造函数不接受任何关于场景尺寸或位置的参数,因此创建出的 QGraphicsScene 的默认大小为一个空的场景。你可以随时通过 setSceneRect() 函数来设定场景的实际大小和位置。

示例代码:

#include <QGraphicsScene>
#include <QGraphicsView>

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

    // 创建一个未指定初始大小的 QGraphicsScene
    QGraphicsScene* scene = new QGraphicsScene();

    // 设置场景的大小为 800x600
    scene->setSceneRect(0, 0, 800, 600);

    // 创建一个 QGraphicsView 并关联场景
    QGraphicsView* view = new QGraphicsView();
    view->setScene(scene);

    // 显示 QGraphicsView
    view->show();

    return app.exec();
}

在此示例中,我们首先创建了一个没有预设大小的 QGraphicsScene,然后通过 setSceneRect() 设置了它的大小为 800x600,并在一个 QGraphicsView 中展示出来。

4、void QGraphicsScene::advance()

void QGraphicsScene::advance() 是 QGraphicsScene 类的一个成员函数,在 Qt 的动画系统中起到推进动画的作用。不过请注意,自 Qt5.11 开始,这个函数已被弃用,建议使用 QSequentialAnimationGroup 或其他现代的 Qt 动画框架来进行动画控制。

在旧版本的 Qt 中,如果你在场景中使用了定时器或其他基于时间的动画效果,调用 advance() 函数可以手动推进场景的时间,从而触发相关的动画更新。通常情况下,场景的动画是在事件循环中自动推进的,但在某些需要手动控制动画进度的情况下,可以使用这个函数。

然而,请根据你使用的 Qt 版本选择合适的动画方法,对于较新版本的 Qt,应查阅官方文档了解如何使用新的动画 API。

5、void QGraphicsScene::changed(const QList<QRectF> &region)

QGraphicsScene::changed(const QList<QRectF> &region) 是 Qt GUI 库中的一个方法,该方法用于通知场景中的某个或某些区域发生了变化,并需要重绘这些区域。当你在 QGraphicsScene 中添加、删除或修改了项目,或者项目自身属性发生改变从而影响其视觉表现时,通常会调用这个方法。

这个函数接收一个 QList<QRectF> 类型的参数 region,它包含了一个或多个 QRectF 对象列表,每个 QRectF 表示场景中发生变化的一个矩形区域。当调用 changed() 函数时,关联的 QGraphicsView 将会在下一次事件循环中重绘指定的区域。

例如,在一个自定义的 QGraphicsItem 子类中,如果你改变了项目的外观并且希望视图能够反映这一变化,可以这样做:

void CustomGraphicsItem::someMethodThatChangesAppearance()
{
    // ... 这里做出一些更改项目外观的操作 ...

    // 计算并设置需要更新的矩形区域
    QRectF changedArea(boundingRect());
    scene()->changed({changedArea}); // 假设 boundingRect() 返回该项目变化后的边界框
}

这样,QGraphicsView 就会知道要重新绘制 CustomGraphicsItem 所在的区域。

6、void QGraphicsScene::clear()

GraphicsScene::clear() 是Qt图形视图框架(Graphics View Framework)中 QGraphicsScene 类的一个成员函数,它的作用是清除整个场景的内容。调用此函数后,场景中的所有 QGraphicsItem 子对象(包括任何用户自定义的图形项、线条、形状、图片等)都将被移除,且不再与该场景关联。

使用此函数的典型场景可能是在应用程序需要重置或初始化场景内容的时候,确保场景回到初始空的状态。

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

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

    // 创建一个 QGraphicsScene 对象
    QGraphicsScene* scene = new QGraphicsScene();

    // 向场景中添加几个矩形图形项
    for (int i = 0; i < 5; ++i) {
        QGraphicsRectItem* rect = scene->addRect(i * 100, 0, 50, 50, QPen(Qt::black), QBrush(Qt::blue));
    }

    // 创建一个 QGraphicsView 来展示场景
    QGraphicsView* view = new QGraphicsView(scene);
    view->show();

    // 等待一段时间后清除场景
    QTimer::singleShot(2000, scene, [=](){
        // 清除场景中的所有图形项
        scene->clear();
    });

    return app.exec();
}

在这个示例中,程序首先创建了一个 QGraphicsScene 并向其中添加了几个矩形图形项,然后通过 QGraphicsView 显示这个场景。两秒后(通过 QTimer::singleShot 定时),调用了 scene->clear() 函数,清除了场景中的所有图形项,此时视图将自动更新以显示清空后的场景。

7、void QGraphicsScene::clearSelection()

QGraphicsScene::clearSelection() 是 QGraphicsScene 类的一个成员函数,用于取消场景中所有选定的图形项的选择状态。在 Qt 的 Graphics View 框架中,当用户或应用程序通过编程方式选择了场景中的一个或多个图形项时,这些项会被标记为“selected”。调用 clearSelection() 函数将会取消所有这些选定状态,使得场景中不再有任何图形项处于选中状态。

以下是一个简单的使用示例:

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

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

    // 创建一个 QGraphicsScene 对象
    QGraphicsScene* scene = new QGraphicsScene();

    // 添加一个矩形图形项到场景
    QGraphicsRectItem* rectItem = scene->addRect(0, 0, 100, 100);
    rectItem->setFlag(QGraphicsItem::ItemIsSelectable); // 允许矩形可被选择

    // 创建一个 QGraphicsView 来显示场景
    QGraphicsView* view = new QGraphicsView(scene);
    view->show();

    // 假设现在用户已经选中了这个矩形
    scene->setSelectionArea(rectItem->boundingRect()); // 选中矩形(此处仅为模拟,实际中可能是用户点击或通过代码选择)

    // 清除场景中的所有选择
    scene->clearSelection(); // 此时矩形不再处于选中状态

    return app.exec();
}

在这个示例中,我们创建了一个允许被选择的矩形图形项,并假设它已被选中。然后调用 clearSelection() 函数取消所有选择,使得矩形不再是选中状态。

8、void QGraphicsScene::focusItemChanged(QGraphicsItem *newFocusItemQGraphicsItem *oldFocusItemQt::FocusReason reason)

void QGraphicsScene::focusItemChanged(QGraphicsItem *newFocusItem, QGraphicsItem *oldFocusItem, Qt::FocusReason reason) 是 QGraphicsScene 类的一个信号。当场景中的焦点图形项发生改变时,这个信号会被发射。

  • QGraphicsItem *newFocusItem:这是新获得焦点的图形项,如果没有图形项获得焦点,则为 nullptr

  • QGraphicsItem *oldFocusItem:这是失去焦点的先前焦点图形项,如果没有前一焦点项,则也为 nullptr

  • Qt::FocusReason reason:这是焦点改变的原因,可能的值包括 Qt::MouseFocusReason(鼠标导致焦点改变)、Qt::TabFocusReason(通过 Tab 键切换焦点)以及其他原因。

这个信号常用于监控场景内图形项的焦点变化情况,以便在焦点转移时执行相应的动作或更新界面状态。

示例使用:

class MyGraphicsScene : public QGraphicsScene
{
    Q_OBJECT

public:
    explicit MyGraphicsScene(QObject *parent = nullptr) : QGraphicsScene(parent) {}

private slots:
    void onFocusItemChanged(QGraphicsItem *newFocusItem, QGraphicsItem *oldFocusItem, Qt::FocusReason reason)
    {
        if (newFocusItem) {
            qDebug() << "New focus item: " << newFocusItem;
        } else {
            qDebug() << "No item has focus";
        }

        if (oldFocusItem) {
            qDebug() << "Lost focus item: " << oldFocusItem;
        } else {
            qDebug() << "Previously no item had focus";
        }

        switch(reason) {
        case Qt::MouseFocusReason:
            qDebug() << "Focus changed due to mouse interaction.";
            break;
        case Qt::TabFocusReason:
            qDebug() << "Focus changed due to tab key navigation.";
            break;
        // ... handle other reasons similarly ...
        default:
            qDebug() << "Focus changed for unknown reason.";
        }
    }

signals:

public slots:

};

// 在初始化场景时连接信号
MyGraphicsScene *scene = new MyGraphicsScene();
connect(scene, &MyGraphicsScene::focusItemChanged, scene, &MyGraphicsScene::onFocusItemChanged);

这段代码定义了一个继承自 QGraphicsScene 的 MyGraphicsScene 类,并覆盖了 focusItemChanged 信号的槽函数,每当场景内的焦点项发生改变时,都会输出相应的信息。

9、bool QGraphicsScene::focusNextPrevChild(bool next)

bool QGraphicsScene::focusNextPrevChild(bool next) 是 QGraphicsScene 类的一个成员函数,但它实际上并未在 QGraphicsScene 中实现。这是因为 QGraphicsScene 不是 QWidget 的派生类,它并不直接参与焦点管理。

焦点切换通常是在包含 QGraphicsView 的窗口小部件层次结构中进行的,而不是在 QGraphicsScene 中。若要按顺序切换 QGraphicsScene 中图形项的焦点,可以通过调用图形项自身的 setFocus() 函数配合场景提供的 QGraphicsItem::nextInFocusChain() 和 QGraphicsItem::previousInFocusChain() 函数来实现。

例如,想要按照焦点链切换下一个图形项,可以采用如下伪代码逻辑:

QGraphicsItem *currentItem = scene->focusItem();
if (currentItem) {
    QGraphicsItem *nextItem = currentItem->nextInFocusChain();
    if (nextItem) {
        nextItem->setFocus(Qt::OtherFocusReason);
    }
}

请注意,图形项必须先设置 ItemIsFocusable 标志才能获取焦点。此外,焦点链的顺序取决于各个图形项的位置以及它们之间的关系。

10、void QGraphicsScene::invalidate(const QRectF &rect = QRectF(), QGraphicsScene::SceneLayers layers = AllLayers)

void QGraphicsScene::invalidate(const QRectF &rect = QRectF(), QGraphicsScene::SceneLayers layers = AllLayers) 是 QGraphicsScene 类的一个成员函数,它用于通知场景中的指定区域或全部区域需要重新绘制。

参数说明:

  • const QRectF &rect:一个可选参数,代表需要失效(重新绘制)的场景区域,默认为整个场景。如果提供了具体的 QRectF,则只会重新绘制该矩形区域内的内容。
  • QGraphicsScene::SceneLayers layers:也是一个可选参数,表示需要失效的是哪些图层,默认为 AllLayers,意味着所有的图层都需要重新绘制。也可以指定单个或多个图层进行重新绘制。

当场景中的某些内容发生改变但尚未触发视图更新时,调用此函数可以强制指定区域或图层的内容进行重新绘制。这对于优化性能非常有用,特别是当仅需局部更新时,可以避免整个场景的无谓重绘。

示例用法:

QGraphicsScene* scene = new QGraphicsScene();
//... 在场景中添加图形项...

// 假设某个区域的内容发生了变化,需要更新显示
QRectF dirtyRect(0, 0, 100, 100);
scene->invalidate(dirtyRect); // 只重新绘制dirtyRect区域的内容

// 或者如果整个场景的内容都变了
scene->invalidate(); // 重新绘制整个场景的内容

11、void QGraphicsScene::sceneRectChanged(const QRectF &rect)

void QGraphicsScene::sceneRectChanged(const QRectF &rect) 是 QGraphicsScene 类的一个信号(signal),在 QGraphicsScene 的场景区域(scene rectangle)发生变化时被发射(emitted)。这个信号并不需要用户直接调用,而是由框架在场景矩形自动调整或者通过 setSceneRect() 函数手动设置新场景矩形时自动触发。

当场景矩形改变时,此信号会传递新的场景矩形作为参数 const QRectF &rect。监听这个信号的槽(slot)或其他连接到此信号的对象,可以接收到新的场景矩形信息,并据此做出相应的响应,比如调整与场景相关的视图大小、布局等。

例如,在关联了此信号到自定义槽函数后:

connect(scene, &QGraphicsScene::sceneRectChanged,
        this, &MyClass::onSceneRectChanged);

// ...

void MyClass::onSceneRectChanged(const QRectF &newRect)
{
    // 更新视图以适应新的场景矩形
    view->fitInView(newRect);
}

这样每当场景矩形变化时,就会调用 onSceneRectChanged 函数来处理新的场景尺寸。

12、void QGraphicsScene::selectionChanged()

void QGraphicsScene::selectionChanged() 是 QGraphicsScene 类的一个信号(signal),当场景中的选择集(即被选中的图形项集合)发生改变时,这个信号会被发射。这意味着有新的图形项被选中,或者已有选中的图形项被取消选择。

监听此信号的槽函数可以得到场景中选择状态变化的通知,进而执行相应的操作,如更新UI、保存选择状态、处理选中项的特殊行为等。

虽然信号本身不需要直接调用,但在编程过程中,通常会通过 QObject::connect() 函数将这个信号连接到适当的槽函数上。

示例:

QObject::connect(scene, &QGraphicsScene::selectionChanged,
                 this, &MyClass::onSelectionChanged);

// ...

void MyClass::onSelectionChanged()
{
    foreach(QGraphicsItem* item, scene->selectedItems()) {
        // 处理选中的每一个图形项
        qDebug() << "Selected item:" << item->data(0).toString();
    }
}

在这个示例中,当 QGraphicsScene 中的选择发生改变时,onSelectionChanged 函数会被调用,并打印出所有当前选中的图形项的相关数据。

13、void QGraphicsScene::update(const QRectF &rect = QRectF())

void QGraphicsScene::update(const QRectF &rect = QRectF()) 是 QGraphicsScene 类的一个成员函数,用于请求指定区域(或默认为整个场景)的重绘。当场景中的某些内容发生变化,但还没有自动触发视图更新时,可以调用此函数。

函数参数:

  • const QRectF &rect:指定需要更新的矩形区域,默认为空矩形,即整个场景。

当调用此函数时,QGraphicsScene 将会把指定的矩形区域标记为“脏区”(dirty region),关联的 QGraphicsView 在下一次事件循环中会检查并重绘这部分区域,以更新画面。

示例:

// 假设 scene 是一个已有的 QGraphicsScene 对象
// 并且某个矩形区域的内容发生了变化
QRectF updatedArea(10, 10, 100, 100); // 更新的区域

// 请求场景的指定区域进行重绘
scene->update(updatedArea);

在这个例子中,我们只请求了 (10, 10) 到 (110, 110) 这个矩形区域内的内容进行重绘,而非整个场景。这有助于提升图形渲染的效率,尤其是在大型场景中只需要局部更新时。

14、QGraphicsScene::~QGraphicsScene()

QGraphicsScene::~QGraphicsScene() 是 QGraphicsScene 类的析构函数。在 C++ 中,析构函数是一种特殊的方法,当对象生命周期结束时(例如该对象的作用域结束或者明确调用 delete 操作释放对象时)会被自动调用。

对于 QGraphicsScene 类而言,其析构函数的主要作用是:

  1. 清理并释放与该场景相关的所有资源,包括但不限于:

    • 删除场景中所有的项目(QGraphicsItem)。
    • 解除与任何视图(QGraphicsView)或其他系统资源的连接和引用。
    • 释放内存和其他内部数据结构。
  2. 确保当 QGraphicsScene 对象不再使用时,与其关联的所有组件也能正确地被销毁,防止内存泄漏或其他资源未释放的问题。

注意,在实际开发中,通常不需要手动调用析构函数,而是由C++的自动内存管理机制来负责调用。当你不再需要 QGraphicsScene 对象,并且没有其他地方对其持有引用时,确保显式地删除它或让它超出作用域,这样系统就会自动调用析构函数完成清理工作。

15、QGraphicsItem *QGraphicsScene::activePanel() const

此函数在QT的4.6版本以前使用,在这里就不做赘述了。

16、QGraphicsWidget *QGraphicsScene::activeWindow() const

确实存在 QGraphicsWidget *QGraphicsScene::activeWindow() const 这个成员函数,不过这个函数存在于较早版本的 Qt 中,并且在目前 Qt 的最新稳定版(如Qt 6.x)中已经不存在。

在早期版本的 Qt 中,QGraphicsScene::activeWindow() 函数用来获取当前在场景中活跃(active)的 QGraphicsWidget(如果有的话)。在图形视图框架中,QGraphicsWidget 是一种可以像普通窗口小部件那样具有布局、样式表支持等功能的 QGraphicsItem

然而,由于 Qt API 的演变和改进,后来的版本中,这种功能可能通过其他方式实现或者被废弃。在使用时,请根据你所使用的 Qt 版本查阅对应的官方文档。

17、QGraphicsEllipseItem *QGraphicsScene::addEllipse(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush())

QGraphicsEllipseItem *QGraphicsScene::addEllipse(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush()) 是 QGraphicsScene 类的一个成员函数,用于在场景中添加一个椭圆图形项。

函数参数:

  • const QRectF &rect:指定椭圆的外接矩形框的大小和位置。
  • const QPen &pen:可选参数,用于定义椭圆轮廓线的笔刷属性,如颜色、宽度等,默认为无轮廓线(QPen())。
  • const QBrush &brush:可选参数,用于定义椭圆填充区域的颜色或图案,默认为透明填充(QBrush())。

此函数会返回一个指向新创建的 QGraphicsEllipseItem 对象的指针,该对象已添加到场景中,并根据给定的参数绘制椭圆。

示例代码:

QGraphicsScene *scene = new QGraphicsScene();
QGraphicsEllipseItem *ellipse = scene->addEllipse(QRectF(50, 50, 100, 75),
                                                QPen(Qt::black, 2), // 边框为黑色,宽度为2像素
                                                QBrush(Qt::red));   // 填充色为红色

在这个示例中,我们在场景中添加了一个中心点在 (50, 50)、宽100、高75的红色填充、黑色边框的椭圆图形项。

18、QGraphicsEllipseItem *QGraphicsScene::addEllipse(qreal xqreal yqreal wqreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())

这个函数同样用于在QGraphicsScene中添加一个椭圆图形项,但其参数有所不同:

  • qreal x:椭圆左上角的x坐标。
  • qreal y:椭圆左上角的y坐标。
  • qreal w:椭圆的宽度。
  • qreal h:椭圆的高度。
  • const QPen &pen:可选参数,设置椭圆的轮廓线样式,默认为无轮廓线(QPen())。
  • const QBrush &brush:可选参数,设置椭圆内部填充的样式,默认为透明填充(QBrush())。

通过这些参数,您可以直接指定椭圆左上角的位置及其尺寸,而不是使用一个完整的QRectF来定义整个外接矩形。

示例代码:

QGraphicsScene *scene = new QGraphicsScene();
QGraphicsEllipseItem *ellipse = scene->addEllipse(50, 50, 100, 75,
                                                QPen(Qt::black, 2), // 边框为黑色,宽度为2像素
                                                QBrush(Qt::red));   // 填充色为红色

在这个例子中,将在 (50, 50) 点开始绘制一个宽度为100,高度为75的椭圆,它具有黑色边框和红色填充。

19、void QGraphicsScene::addItem(QGraphicsItem *item)

void QGraphicsScene::addItem(QGraphicsItem *item) 是 Qt 的 QGraphicsScene 类的一个成员函数,它的作用是在当前的 QGraphicsScene 中添加一个已存在的 QGraphicsItem 或其派生类的对象。

当您创建了诸如 QGraphicsRectItem、QGraphicsEllipseItem、QGraphicsLineItem 或自定义的 QGraphicsItem 子类等图形项目,并想让它们显示在 QGraphicsView 中时,您需要先将这些项目添加到 QGraphicsScene 中。调用此函数即可实现这一目的:

// 创建一个矩形图形项实例
QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 100, 50);

// 创建一个场景
QGraphicsScene *scene = new QGraphicsScene();

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

// 与视图关联
QGraphicsView *view = new QGraphicsView(scene);

在这个例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值