QGraphics Scene、Graphics Item、Graphics View关系及一个实例

QGraphics图形视图框架

QGraphics图形视图框架由3部分组成:

  • QGraphics Scene
  • Graphics Item
  • Graphics View

Scene无限大,负责管理所有的Items,View是用来查看的窗口,可以透过这个窗口看到Scene的一部分。

注:有一种使用方法,多个Scene对应一个View,该每个Scene有自己的Items,相当于多个Scene每个都有自己管理得对象,通过切换Scene实现显示Item组的切换。

在这里插入图片描述

QGraphics Scene

功能

提供了图形视图框架中的场景,场景有以下功能:

  1. 提供用于管理大量图形项的高速接口
  2. 传播事件到每一个图形项
  3. 管理图形项的状态,比如选择和处理焦点
  4. 提供无变换的渲染功能,主要用于打印

QGraphics Item

The QGraphicsItem class is the base class for all graphical items in a QGraphicsScene.

It provides a light-weight foundation for writing your own custom items. This includes defining the item’s geometry, collision detection, its painting implementation and item interaction through its event handlers. QGraphicsItem is part of the Graphics View Framework

为了方便使用,Qt提供了一些最常用的基础标准图元,具体如下:

  • QGraphicsEllipseItem 提供椭圆对象
  • QGraphicsLineItem 提供线对象
  • QGraphicsPathItem 提供路径对象
  • QGraphicsPixmapItem 提供图像对象
  • QGraphicsPolygonItem 提供多边形对象
  • QGraphicsRectItem 提供矩形对象
  • QGraphicsSimpleTextItem 提供文本标签对象
  • QGraphicsTextItem 提供高级文本浏览对象

Items的位置依赖于父坐标,如果父对象相对上一级坐标进行变换,则依赖该父对象的子对象会相对上一级坐标系一起改变,但是相对该父坐标系来说不变。

在这里插入图片描述
在这里插入图片描述

QGraphics View

QGraphics View提供一个观察QGraphicsScene的实例窗口。视图窗口是一个可以滚动的区域,提供一个滚动条来浏览大的场景。

实例

下边完成了一个实例,绘制了多种图元,并且对于QGraphicsView做了放大缩小旋转的实现。核心代码实现如下:

在这里插入图片描述

鼠标响应重载

void MyGraphicView::mousePressEvent(QMouseEvent *event)
{
    if( event->button() == Qt::RightButton)
    {
        QMenu *mouseLeftMenu = new QMenu(this);
        QAction* rotateLeft = new QAction(tr("rotateLeft"), this);
        QAction* rotateRight = new QAction(tr("rotateRight"), this);
        QAction* zoomIn = new QAction(tr("zoomIn"), this);
        QAction* zoomOut = new QAction(tr("zoomOut"), this);

        mouseLeftMenu->addAction(rotateLeft);
        mouseLeftMenu->addAction(rotateRight);
        mouseLeftMenu->addAction(zoomIn);
        mouseLeftMenu->addAction(zoomOut);

        mouseLeftMenu->move(cursor().pos());
        mouseLeftMenu->show();

        connect(rotateLeft, SIGNAL(triggered()), this, SLOT(slot_rotateLeft()));
        connect(rotateRight, SIGNAL(triggered()), this, SLOT(slot_rotateRight()));
        connect(zoomIn, SIGNAL(triggered()), this, SLOT(slot_zoomIn()));
        connect(zoomOut, SIGNAL(triggered()), this, SLOT(slot_zoomOut()));
    }
    else
    {
        QGraphicsView::mousePressEvent(event);
    }
}

槽函数

void MyGraphicView::slot_zoomIn()
{
    m_view->scale(1.2, 1.2);
}
void MyGraphicView::slot_zoomOut()
{
    m_view->scale(1/1.2, 1/1.2);
}
void MyGraphicView::slot_rotateLeft()
{
    m_view->rotate(-30);
}
void MyGraphicView::slot_rotateRight()
{
    m_view->rotate(30);
}

图元绘制

void MainWindow::DrawDemo()
{
    QGraphicsScene *scene = new QGraphicsScene();   // 定义一个场景,设置背景色为白色
    scene->setBackgroundBrush(Qt::white);

    QPen pen;   // 定义一个画笔,设置画笔颜色和宽度
    pen.setColor(QColor(0, 160, 230));
    pen.setWidth(10);

    QGraphicsRectItem *rectItem = new QGraphicsRectItem();   // 定义一个矩形图元
    rectItem->setRect(0, 0, 80, 80);
    rectItem->setPen(pen);
//    m_rectItem->setBrush(QBrush(QColor(255, 0, 255)));
    rectItem->setFlag(QGraphicsItem::ItemIsMovable);

    QGraphicsLineItem *lineItem = new QGraphicsLineItem();    // 定义一个直线图元
    lineItem->setLine(QLineF(0, 0, 100, 100));
    pen.setColor(QColor(0, 50, 230));
    lineItem->setPen(pen);
    lineItem->setFlag(QGraphicsItem::ItemIsMovable);

    QGraphicsEllipseItem *ellipseItem = new QGraphicsEllipseItem();     //定义一个圆形图元
    pen.setColor(QColor(255, 0, 0));
    ellipseItem->setRect(QRectF(0,100,80,80));
    ellipseItem->setPen(pen);
//    ellipseItem->setBrush(QBrush(QColor(255, 0, 0)));
    ellipseItem->setFlag(QGraphicsItem::ItemIsMovable);

    QGraphicsPathItem *pathItem = new QGraphicsPathItem();    // 定义一个路径图元
    QPainterPath path;
    path.moveTo(90, 50);
    path.lineTo(120, 50);
    path.lineTo(105, 10);
    path.closeSubpath();
    pathItem->setPath(path);
    pen.setColor(QColor(0, 160, 50));
    pathItem->setPen(pen);
    pathItem->setFlag(QGraphicsItem::ItemIsMovable);

    QGraphicsPolygonItem *polygonItem = new QGraphicsPolygonItem();   // 定义一个多边形图元
    QPolygonF polygon;
    polygon << QPointF(-100.0, -100.0) << QPointF(100.0, -100.0)
            << QPointF(200.0, 200.0) << QPointF(0.0, 200);
    polygonItem->setPolygon(polygon);
    pen.setColor(QColor(50, 120, 230));
    polygonItem->setPen(pen);
    polygonItem->setFlag(QGraphicsItem::ItemIsMovable);

    scene->addItem(rectItem);      // 把矩形图元添加到场景
    scene->addItem(lineItem);      // 把直线图元添加到场景
    scene->addItem(pathItem);      // 把路径图元添加到场景
    scene->addItem(ellipseItem);   // 把圆形图元添加到场景
    scene->addItem(polygonItem);   // 把多边形图元添加到场景

    m_view = new MyGraphicView(scene); // 定义一个视图,并把场景添加到视图
    m_view->setDragMode(QGraphicsView::RubberBandDrag); //设置view橡皮筋框选区域
    m_vBoxLayout->addWidget(m_view);
}

源代码下载地址

参考:

  1. qt中鼠标右键的简单实现

  2. Qt之QGraphicsView进阶篇

  3. Qt之QGraphicsView入门篇

Graphics View 是 Qt 框架中用于绘图的一个模块。下面是一个使用 Graphics View 绘制简单图形的示例程序。 首先,需要在程序中引入 QGraphicsViewQGraphicsScene 和 QGraphicsItem 这三个类的头文件。 然后,在程序的主函数或其他适当的位置,创建一个 QGraphicsView 实例,并设置场景的大小和背景颜色。例如: QGraphicsView *view = new QGraphicsView(); view->setSceneRect(0, 0, 800, 600); view->setBackgroundBrush(Qt::white); 接着,创建一个 QGraphicsScene 实例,并设置场景的大小和背景颜色。例如: QGraphicsScene *scene = new QGraphicsScene(); scene->setSceneRect(0, 0, 800, 600); scene->setBackgroundBrush(Qt::white); 然后,创建一个 QGraphicsItem 的子类,并实现它的绘制函数 paint()。在 paint() 函数中,使用 QPainter 绘制所需的图形,如圆形、矩形等。例如: class MyGraphicsItem : public QGraphicsItem { public: MyGraphicsItem() {} QRectF boundingRect() const override { return QRectF(-50, -50, 100, 100); } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override { painter->setBrush(Qt::blue); painter->drawEllipse(-50, -50, 100, 100); } }; 最后,将创建的 MyGraphicsItem 添加场景中,并将场景设置给 QGraphicsView 实例。例如: MyGraphicsItem *item = new MyGraphicsItem(); scene->addItem(item); view->setScene(scene); view->show(); 整个程序的执行过程是,创建一个 QGraphicsView 实例,并设置它的场景一个 QGraphicsScene 实例。然后,在 QGraphicsScene 中创建一个 QGraphicsItem 的子类,实现绘制函数 paint()。最后,将这个 QGraphicsItem 添加QGraphicsScene 中,从而在 QGraphicsView 中显示出来。 这个示例只是 Graphics View 的基础用法,真实的 Graphics View 应用程序会更加复杂,可以通过修改 MyGraphicsItem 的 paint() 函数来实现更多的绘图操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

机器人梦想家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值