是一种基于图形项的(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);
问题:怎保存?自定义格式