Qt Graphics View Framework(1)---简单使用

简介

本次主要涉及一下3个类
1. QGraphicsView:显示图形的窗口。
2. QGraphicsScene:用于绘制的画布,一切的绘制和时间都发生在画布上,QGraphicsView用于展示QGraphicsScene,如果画布大于QGraphicsView的尺寸,窗口会自动创建滚动条。
3. QGraphicsItem:在QGraphicsScene上展示的item。QGraphicsScene使用一个BSP(二进制空间分区Binary Space Partitioning)树来提供快速的项发现,正因为如此,它可以使巨大的场景实时地可视化,即便它有上百万个项(item)。

使用QGraphicsView来绘制一个长方体

首先我们来写一个QGraphicsItem的子类来作为我们的长方体。
子类主要重写一下三个函数:
1. QRectF boundingRect()const
定义项目的外形,QGraphicsView使用它来决定重绘的范围 ,所以你可以在这个范围外搞事情,但搞完后QGraphicsView不会帮忙擦屁股。
2. void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
绘图事件,类似于paintEvent。
3. QPainterPath shape()const
表明item的形状主要用于碰撞检测,命中测试等等。

这里函数比较少就这样写了,希望不影响可读性。

class MyItem : public QGraphicsItem
{
public:
    MyItem(QRect rect)
    {
        m_rect = rect;
    }
    QRectF boundingRect()const
    {
        return m_rect;
    }
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
        Q_UNUSED(option);//
        Q_UNUSED(widget);//取消警告,看着心烦
        painter->drawRect(QRect(m_rect.x(),m_rect.y(),m_rect.width(),m_rect.height()));
    }
    QPainterPath shape()const
    {
        QPainterPath path;
        path.addRect(m_rect);
        return path;
    }
private:
    QRect m_rect;
};

之后建立窗口,设置画布:

QGraphicsScene scene;
scene.setSceneRect(-300,-300,600,600);//为了让原点在画布中心

QGraphicsView view(&scene);
view.setGeometry(200,200,400,400);

MyItem *item = new MyItem(QRect(0,0,200,200));//基于画布的坐标
scene.addItem(item);//往“画布”上绘制MyItem
item->setPos(0,0);

view.show();

这样就完成了长方形的绘制。

其他

感觉第一篇毛都没讲啊,坐标这一块准备放到第二篇,再介绍一点帅气的功能把:

选中

在构造函数中添加

setFlags(ItemIsSelectable);

在paint中添加

if(option->state & QStyle::State_Selected)
        {
            painter->setPen(QPen(Qt::red,2,Qt::DotLine));
            painter->drawRect(m_rect);
        }

现在我们的item会对选中做出响应。

拖动

继续添加标记。(可以在帮助文档中看到其他标记)

setFlags(ItemIsSelectable | ItemIsMovable);

就可以让我们拖着item到处动了。

缩放,旋转

  1. 缩放
    使用QGraphicsView的scale方法进行缩放。例如
view.scale(2,4);
  1. 旋转
    使用QGraphicsView的rotate方法进行缩放。例如
view.rotate(30);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值