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

文章目录

  • QGraphics Scene
    • 功能
  • QGraphics Item
  • QGraphics View
  • 实例
    • 鼠标响应重载
    • 图元绘制

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

  • QGraphics Scene
  • Graphics Item
  • Graphics View

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

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

QGraphics Scene、Graphics Item、Graphics View关系及一个实例_第1张图片

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 Scene、Graphics Item、Graphics View关系及一个实例_第2张图片

QGraphics View

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

实例

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

QGraphics Scene、Graphics Item、Graphics View关系及一个实例_第3张图片

 

鼠标响应重载

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入门篇

你可能感兴趣的:(qt,qt,开发语言)