qt Graphic View 学习

是一种基于图形项的(Graphic Item)模型/视图模式。

场景、视图、图形项组成。

1.场景:QGraphicScence类

场景不可见,是管理图像项的容器。

场景坐标:等价于Qpainter的逻辑坐标(窗口坐标,setwindow),一般以场景的中心为原点。单位是像素

主要函数

1.QGraphicsItemGroup *createItemGroup(const QList<QGraphicsItem *> &items); //创建图形项组

2.void destroyItemGroup(QGraphicsItemGroup *group);//释放图形项组

3.QGraphicsItem *focusItem() const;获取当前焦点的图形项

4.void addItem(QGraphicsItem *item); //添加图形项

5.void removeItem(QGraphicsItem *item); //删除图形项

6.QGraphicsLineItem *addLine(const QLineF &line, const QPen &pen = QPen());//添加直线,其他的图像项类似

7.QGraphicsItem *itemAt(const QPointF &pos, const QTransform &deviceTransform) const;//获取某个位置的顶层图形项

8. QList<QGraphicsItem *> items(const QRectF &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const;

9.QList<QGraphicsItem *> selectedItems() const;//选中的图形项列表

10.void clearSelection();清除选中列表

11.void setSceneRect(const QRectF &rect);   设置场景的区域,单位是像素,窗口坐标(逻辑坐标)

12.QList <QGraphicsView *> views() const;  从场景得到视图指针

 

2.视图:QgraphicView类

其基类为QWideget,所以很多操作函数都有

用于显示场景的内容,当视图比场景小时,提供卷滚条移动。

用来接收键盘和鼠标输入信号。

视图坐标:和设备坐标相同,是物理坐标(视口坐标,setviewport)。缺省以左上角为原点(0,0)。单位是像素,只跟widget或视口有关,与场景无关。

坐标映射:

1.将视图坐标转化为场景坐标: QGraphicview 类的  QPointF mapToScene(const QPoint &point) const;

2.将场景坐标转化为视图坐标:QGraphicview 类的   QPoint mapFromScene(const QPointF &point) const;

可以进行平移、旋转、缩放等变换。

    void rotate(qreal angle);     //视图旋转
    void scale(qreal sx, qreal sy);  //视图缩放
    void shear(qreal sh, qreal sv);
    void translate(qreal dx, qreal dy);

主要函数:

1.void setScene(QGraphicsScene *scene);  //设置关联的场景

2.void setSceneRect(const QRectF &rect); //设置关联的场景在视图的矩形区域

3.QGraphicsItem *itemAt(const QPoint &pos) const; //获取视图坐标的某一位置的图形项,  (直接通过视图找到图形项,应该要在场景中设置好)

4.QList<QGraphicsItem *> items(const QPoint &pos) const;//

5.void setBackgroundBrush(const QBrush &brush);

6.QTransform transform() const;

7.mapToScene() 视图坐标转化为场景坐标

8.mapFromScene 场景坐标转化为视图坐标

9.resetTransform  //恢复,撤销所有的缩放旋转操作

10.QGraphicsScene *scene() const;  在视图类中得到场景的指针。

3.图形项:QGraphicsItem类

创建新的图形项,把图像项大小和显示位置使用窗口坐标即逻辑坐标)作为构造函数的参数,设置进去。也可以通过setpos来设置图形项的位置。

支持组合,通过QGraphicsItemGroup类实现组合

图像项坐标局部的逻辑坐标(窗口坐标,setwindow),一般以图件的中心为原点。其中心为(0,0)。

一个图形项的位置是其中心点在父坐标系统的坐标,对于没有父图形项的图形项,其父对象就是场景,图形项的位置就是在场景中的坐标。

每个图形项在场景都有一个坐标,有函数QGraphicsItem::scenePos

QGraphicsItem为基类,以下为常见的子类

QGraphicsLineItem:提供了一个直线项
QGraphicsPixmapItem:提供了一个图像项

QAbstractGraphicsShapeItem:

QGraphicsSimpleTextItem:提供了一个简单的文本标签项
QGraphicsRectItem:提供了一个矩形项
QGraphicsEllipseItem:提供了一个椭圆项
QGraphicsPathItem:提供了一个路径项
QGraphicsPolygonItem:提供了一个多边形项

QGraphicsObject:

QGraphicsTextItem:提供了一个格式化的文本项

QGraphicsItemGroup :组合

根据项目的实际情况,可以直接调用QGraphicsItem的具体子类并设置。也可以自己继承QGraphicsItem或其子类,自己重写paint实现自己想要的图形项。

QGraphicsItemGroup

    void addToGroup(QGraphicsItem *item);   往图形组添加图形项
    void removeFromGroup(QGraphicsItem *item); 从图形组删除图形项

主要函数:

1、void setFlags(GraphicsItemFlags flags); //设置图形项的操作属性,可选择,可移动,可焦点。 ItemIsMovable = 0x1,
        ItemIsSelectable = 0x2, ItemIsFocusable = 0x4,

2.QPointF pos() const;  scenepos

3.void setPos(const QPointF &pos);

4.qreal zValue() const;

5.void setZValue(qreal z);  //设置前置

6.QPointF mapFromScene(const QPointF &point) const;

7.QPointF mapToScene(const QPointF &point) const;

8.void setData(int key, const QVariant &value);//设置数据

9.QVariant data(int key) const;

10.void setRotation(qreal angle);//设置旋转

11.void setScale(qreal scale);//设置缩放

12.void setSelected(bool selected);  //设置选择

13.恢复:单个图形项恢复     调用 setRotation(0);  setScale(1.0);

14.QGraphicsScene *scene() const;  从图形项得到场景指针

15.virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) = 0;  要绘制图形项需要重写GGraphicsItem中的paint()纯虚函数

项目经验:

创建:

1.场景类直接QGraphicsScene

2.继承QGraphicsView,派生出新类作为视图类。并调用setScene函数关联场景。

3.图形项,使用继承于QGraphicsItem的各自具体图形项类,对象初始化是就设置好图像项的大小和显示位置,同时设置setData、setBrush、setZValue、setSelected等信息。

4.场景对象调用addItem把图形项添加到场景。

操作:

鼠标操作

1.一般是视图类重写鼠标操作的虚函数。

    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event);

问题:怎保存?自定义格式

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值