1 打开设计界面,点开Display Widgets,将Graphics Widget 控件拖动到界面上即可。
1 -QGraphicsView(视图)
2 ---QGraphicsScene(场景)
3 -----QGraphicsItem(图元)
4
5
6 QGraphicsView提供一个可视的窗口,用于显示场景中的图元,一个场景中可以有多个视图。
7 QGraphicsScene本身不可见,是一个存储图元的容器,必须通过与之相连的QGraphicsView视图来显示及与外界进行交互,主要提供图元的操作接口、传递事件和管理各个图元状态。
8 QGraphicsItem是场景中各个图元的基础类。
9 QGraphicsItem图元主要特性如下:
10 A、支持鼠标按下、移动、释放、双击、悬停、滚动和右键菜单事件。
11 B、支持键盘输入焦点和按键事件
12 C、支持拖拽事件
13 D、支持分组,使用父子关系和QGraphicsItemGroup
14 E、支持碰撞检测
15
16 GraphicsView是一个基于图元的Model/View架构的框架,每一个组件都是一个独立的元素。
GraphicsView绘图时首先创建一个场景,然后创建图元对象(如一个直线对象、一个多边形对象),再使用场景的add()函数,将图元对象添加到场景中,最后通过视图进行显示。
对于复杂的图像来说,如果图像包含大量的直线、曲线、多边形等图元对象,管理图元对象比管理QPainter的绘制过程语句要容易,并且图元对象更符合面向对象的思想,图形的可复用性更好。
1 // 1 返回位置为 QPoint 的项,如果有多项,则返回最上面那个项
2 QGraphicsItem *itemAt(const QPoint &pos) const
3 // 2 返回关联场景中的所有项
4 QList
5 // 3 返回有Rect包含或与Rect相交的所有项的列表、这些项按堆叠顺序排列(第一项是最上面的项)
6 QList
7 QList
8 // 4 返回当前视图中的场景,如过没有,返回nullptr
9 QGraphicsScene *scene() const
10 // 5 设置场景的可视化区域 (超出的部分,会出现滚动条)
11 void setSceneRect(const QRectF &rect)
12 void setSceneRect(qreal x, qreal y, qreal w, qreal h)
13 // 6 设置场景在视图中的对齐方式,默认为居中对齐
14 void setAlignment(Qt::Alignment alignment)
15 // 7 设置视图中的场景背景笔刷
16 QBrush backgroundBrush() const
17 void setBackgroundBrush(const QBrush &brush)
18 // 8 设置场景可否被鼠标左键拖动,默认无法被拖动
19 QGraphicsView::DragMode dragMode() const
20 void setDragMode(QGraphicsView::DragMode mode)
21 // 9 设置前景笔刷
22 QBrush foregroundBrush() const
23 void setForegroundBrush(const QBrush &brush)
24 // 10 是否运行场景交互(响应鼠标事件)
25 bool isInteractive() const
26 void setInteractive(bool allowed)
27 // 11 设置场景
28 void setScene(QGraphicsScene *scene)
1 // 1 添加子项目
2 void QGraphicsScene::addItem(QGraphicsItem *item)
3 // 2 移除子项目
4 void QGraphicsScene::removeItem(QGraphicsItem *item)
5 // 3 添加直线项
6 QGraphicsLineItem *QGraphicsScene::addLine(const QLineF &line, const QPen &pen = QPen())
7 QGraphicsLineItem *QGraphicsScene::addLine(qreal x1, qreal y1, qreal x2, qreal y2, const QPen &pen = QPen())
8 // 4 添加椭圆项
9 QGraphicsEllipseItem *addEllipse(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush())
10 QGraphicsEllipseItem *addEllipse(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
11 // 5 添加路径项
12 QGraphicsPathItem *QGraphicsScene::addPath(const QPainterPath &path, const QPen &pen = QPen(), const QBrush &brush = QBrush())
13 // 6 添加图片项
14 QGraphicsPixmapItem *QGraphicsScene::addPixmap(const QPixmap &pixmap)
15 // 7 添加矩形项
16 QGraphicsRectItem *addRect(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush())
17 QGraphicsRectItem *addRect(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
18 // 8 添加文本项
19 QGraphicsTextItem *QGraphicsScene::addText(const QString &text, const QFont &fOnt= QFont())
20 // 9 添加多边形项
21 QGraphicsPolygonItem *addPolygon(const QPolygonF &polygon, const QPen &pen = QPen(), const QBrush &brush = QBrush())
22 // 9 添加装置项
23 QGraphicsProxyWidget *QGraphicsScene::addWidget(QWidget *widget, Qt::WindowFlags wFlags = Qt::WindowFlags())
24 // 10 设置场景的背景画刷
25 QBrush backgroundBrush() const
26 // 11 清除焦点
27 void clearFocus()
28 // 12 获取与选定项目包含或相交的项
29 QList
30 // 13 将一些项添加到一个分组中,并返回该分组的指针
31 QGraphicsItemGroup *QGraphicsScene::createItemGroup(const QList
32 // 14 拆除分组
33 void QGraphicsScene::destroyItemGroup(QGraphicsItemGroup *group)
34 // 15 设置字体 会触发 FontChange 信号
35 QFont font() const
36 void setFont(const QFont &font)
37 // 16 设置前景笔刷
38 QBrush foregroundBrush() const
39 void setForegroundBrush(const QBrush &brush)
40 // 17 获取场景的高度
41 qreal height() const
42 // 18 获取场景的宽度
43 qreal width() const
44 // 19 查看场景是否是活动的
45 bool isActive() const
46 // 20 返回位置为 QPoint 的项,如果有多项,则返回最上面那个项
47 QGraphicsItem *itemAt(const QPointF &position, const QTransform &deviceTransform) const
48 QGraphicsItem *itemAt(qreal x, qreal y, const QTransform &deviceTransform) const
49 // 21 返回场景中的所有项
50 QList
51 // 22 返回场景中的所有与该点相交的项
52 QList
53 // 23 返回有Rect包含或与Rect相交的所有项的列表、这些项按堆叠顺序排列(第一项是最上面的项)
54 QList
55 // 24 返回场景中的所有与该路径相交的项
56 QList
57 // 25 返回场景中正在被鼠标抓取的项目(正在拖动的项目?)
58 QGraphicsItem *mouseGrabberItem() const
59 // 26 移除所有项目
60 void removeItem(QGraphicsItem *item)
61 // 27 设置场景范围
62 QRectF sceneRect() const
63 void setSceneRect(const QRectF &rect)
64 void setSceneRect(qreal x, qreal y, qreal w, qreal h)
65 // 28 事件过滤器
66 bool QGraphicsScene::sendEvent(QGraphicsItem *item, QEvent *event)
67 // 29 激活项目\部件
68 void setActivePanel(QGraphicsItem *item)
69 void setActiveWindow(QGraphicsWidget *widget)
70 // 30 设置场景的背景画刷
71 QBrush backgroundBrush() const
72 void setBackgroundBrush(const QBrush &brush)
73 // 31 设置调色板
74 QPalette palette() const
75 void setPalette(const QPalette &palette)
76 // 32 设置样式
77 void setStyle(QStyle *style)
78 QStyle *style() const
79 // 33 返回所有包含此场景的视图
80 QList
81 // 34 尚不清楚
82 void update(qreal x, qreal y, qreal w, qreal h)
1 void QGraphicsItem::setVisible(bool visible)
2 // 19 设置模式 是否阻塞父、父父。。。 等面板的输入
3 void QGraphicsItem::setPanelModality(QGraphicsItem::PanelModality panelModality)
4 QGraphicsItem::PanelModality QGraphicsItem::panelModality() const
5 // 20 设置父项(将从旧父项child中移除) 查看父|子项
6 void QGraphicsItem::setParentItem(QGraphicsItem *newParent)
7 QGraphicsItem *QGraphicsItem::parentItem() const
8 QGraphicsObject *QGraphicsItem::parentObject() const
9 QGraphicsWidget *QGraphicsItem::parentWidget() const
10 QList
11 // 21 设置坐标
12 void QGraphicsItem::setPos(const QPointF &pos)
13 void QGraphicsItem::setPos(qreal x, qreal y)
14 QPointF QGraphicsItem::pos() const
15 // 22 设置旋转角度 -360~360
16 void QGraphicsItem::setRotation(qreal angle)
17 qreal QGraphicsItem::rotation() const
18 // 23 设置项的比例因子 成倍的放大或缩小
19 void QGraphicsItem::setScale(qreal factor)
20 qreal QGraphicsItem::scale() const
21 // 24 设置是否被选中(前提为可选)
22 void QGraphicsItem::setSelected(bool selected)
23 // 25 设置工具提示
24 void QGraphicsItem::setToolTip(const QString &toolTip)
25 QString QGraphicsItem::toolTip() const
26 // 26 设置转换矩阵
27 void QGraphicsItem::setTransform(const QTransform &matrix, bool combine = false)
28 QTransform QGraphicsItem::transform() const
29 QTransform QGraphicsItem::deviceTransform(const QTransform &viewportTransform) const
30 // 27 在项坐标中设置转换的原点。
31 void QGraphicsItem::setTransformOriginPoint(const QPointF &origin)
32 void QGraphicsItem::setTransformOriginPoint(qreal x, qreal y)
33 QPointF QGraphicsItem::transformOriginPoint() const
34 // 28 设置动画列表
35 void QGraphicsItem::setTransformations(const QList
36 // 29 设置堆叠顺序,高的项总在低的项上面
37 void QGraphicsItem::setZValue(qreal z)
38 // 30 以路径的形式返回项的形状
39 QPainterPath QGraphicsItem::shape() const
40 // 31 返回图形项
41 QGraphicsObject *QGraphicsItem::toGraphicsObject()
42 // 32 返回最顶层的父项(祖先项),如果没有父项,则返回自己
43 QGraphicsItem *QGraphicsItem::topLevelItem() const
44 // 33 返回最顶层的父项Widget
45 QGraphicsWidget *QGraphicsItem::topLevelWidget() const
46 // 34 设置在其它项之上 (z值相同时,才能生效)
47 void QGraphicsItem::stackBefore(const QGraphicsItem *sibling)
48 // 35 释放键盘抓取
49 void QGraphicsItem::ungrabKeyboard()
50 // 36 释放鼠标抓取
51 void QGraphicsItem::ungrabMouse()
52 // 37 清除该项中的游标。
53 void QGraphicsItem::unsetCursor()
54 // 38 计划重绘这个项目中由rect覆盖的区域。
55 void QGraphicsItem::update(const QRectF &rect = QRectF())
56 void QGraphicsItem::update(qreal x, qreal y, qreal width, qreal height)
57 // 39 返回项目的窗口,如果该项目没有窗口,则返回nullptr。
58 QGraphicsWidget *QGraphicsItem::window() const
59 // 40 返回重绘的矩形(虚函数,需自己实现)
60 QRectF QGraphicsItem::boundingRect() const
61 // 41 返回该项的边界区域
62 QRegion QGraphicsItem::boundingRegion(const QTransform &itemToDeviceTransform) const
63 // 42 将项目的缓存模式设置为模式。默认无缓存
64 void QGraphicsItem::setCacheMode(QGraphicsItem::CacheMode mode, const QSize &logicalCacheSize = QSize())
65 QGraphicsItem::CacheMode QGraphicsItem::cacheMode() const
66 // 43 返回该项子项的边界矩形。
67 QRectF QGraphicsItem::childrenBoundingRect() const
68 // 44 返回该项目的剪辑路径,
69 QPainterPath QGraphicsItem::clipPath() const
70 // 45 判断该项在某种重叠方式下是否与其他项重叠
71 bool QGraphicsItem::collidesWithItem(const QGraphicsItem *other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
72 // 46 判断该项在某种重叠方式下是否与路径重叠
73 bool QGraphicsItem::collidesWithPath(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
74 // 47 返回所有与该项重叠的项
75 QList
76 // 48 返回此项和其他项的最接近的公共祖先项
77 QGraphicsItem *QGraphicsItem::commonAncestorItem(const QGraphicsItem *other) const
78 // 49 如果该项包含点则返回true。
79 virtual bool contains(const QPointF &point) const
80 // 50 设置标志
81 void QGraphicsItem::setFlags(QGraphicsItem::GraphicsItemFlags flags)
82 void QGraphicsItem::setFlag(QGraphicsItem::GraphicsItemFlag flag, bool enabled = true)
83 QGraphicsItem::GraphicsItemFlags QGraphicsItem::flags() const
84 // 51 水平移动
85 void QGraphicsItem::moveBy(qreal dx, qreal dy)
86 // 52 这个虚函数返回一个表示该项不透明区域的形状。
87 QPainterPath QGraphicsItem::opaqueArea() const
88 // 53 返回项的面板,如果该项没有面板,则返回nullptr。我的项目是一个面板,它将返回本身。否则,它将返回最近的前面板。
89 QGraphicsItem *QGraphicsItem::panel() const
90 // 54 返回该项的当前场景,如果该项没有存储在场景中,则返回nullptr
91 QGraphicsScene *QGraphicsItem::scene() const
92 // 55 返回该项目在场景坐标中的边界矩形,
93 QRectF QGraphicsItem::sceneBoundingRect() const
94 // 56 返回项目在场景坐标中的位置。
95 QPointF QGraphicsItem::scenePos() const
96 // 57 通过dx, dy滚动rect的内容。如果rect是一个空矩形(默认),项目的边界矩形会滚动。
97 void QGraphicsItem::scroll(qreal dx, qreal dy, const QRectF &rect = QRectF())
98 // 58 设置此项目的笔。
99 void QAbstractGraphicsShapeItem::setPen(const QPen &pen)
100 // 59 设置项目的笔刷为笔刷。
101 void QAbstractGraphicsShapeItem::setBrush(const QBrush &brush)
1 // .h
2 #include
3 #include
4
5 QGraphicsView * graphicsView; // 定义视图
6 QGraphicsScene graphicsScene; // 定义场景
7 QGraphicsPathItem graphicsPathItem; // 定义路径类图元
8 QPainterPath path; // 定义路径
9 QPen pen; // 定义画笔
10 // .cpp
11 graphicsView = ui->graphicsView; // 获取UI上的视图
12 graphicsView->setScene(&graphicsScene); // 将场景添加到视图中
13
14 pen.setColor(QColor(0,0,128,150)); // 设置画笔颜色
15 pen.setWidth(6); // 设置画笔宽度
16 graphicsPathItem->setPen(pen); // 图元绑定画笔
17
18 path.addRect(0,0,60,60); // 在路径中添加矩形
19 path.addText(QPoint(0,30),QFont("微软雅黑", 15, QFont::Thin),"电台一"); // 在路径中添加文字
20
21 graphicsPathItem.setPath(path); // 将路径添加到图元中
22 graphicsScene.addItem(&graphicsPathItem); // 将图元添加到场景中
23
24
25 /*----------------------------------- 更新视图的方式 -------------------------------------*/
26 // 只需更新图元即可
27 path.addRect(20,20,60,60); // 更新路径
28 graphicsPathItem.setPath(path); // 更新图元
1 // 1 在指定的边界矩形内创建一个椭圆,并将其作为封闭的子路径添加到画家路径中。
2 void QPainterPath::addEllipse(const QRectF &boundingRectangle)
3 void QPainterPath::addEllipse(qreal x, qreal y, qreal width, qreal height)
4 // 2 将给定的路径作为封闭的子路径添加到此路径。
5 void QPainterPath::addPath(const QPainterPath &path)
6 // 3 将给定的多边形作为(未闭合的)子路径添加到路径中。
7 void QPainterPath::addPolygon(const QPolygonF &polygon)
8 // 4 将给定的矩形作为封闭的子路径添加到此路径。
9 void QPainterPath::addRect(const QRectF &rectangle)
10 void QPainterPath::addRect(qreal x, qreal y, qreal width, qreal height)
11 // 5 将给定的文本作为一组从提供的字体创建的封闭子路径添加到此路径。
12 void QPainterPath::addText(const QPointF &point, const QFont &font, const QString &text)
13 void QPainterPath::addText(qreal x, qreal y, const QFont &font, const QString &text)
14 // 6 以浮点精度的矩形返回此画家路径的边界矩形。
15 QRectF QPainterPath::boundingRect() const
16 // 7 清除存储的路径元素。
17 void QPainterPath::clear()
18 // 8 通过在子路径的开始处画一条线来关闭当前的子路径,
19 void QPainterPath::closeSubpath()
20 // 9 通过从路径的最后一个元素添加一行到给定路径的第一个元素,将给定路径连接到此路径。
21 void QPainterPath::connectPath(const QPainterPath &path)
22 // 10 如果给定点在路径内返回true,否则返回false。
23 bool QPainterPath::contains(const QPointF &point) const
24 bool QPainterPath::contains(const QRectF &rectangle) const
25 bool QPainterPath::contains(const QPainterPath &p) const
26 // 11 返回路径的当前位置。
27 QPointF QPainterPath::currentPosition() const
28 // 12 将画家路径的填充规则设置为给定的填充规则。Qt提供了两种填充路径的方法:Qt::OddEvenFill (default) Qt::WindingFill
29 void QPainterPath::setFillRule(Qt::FillRule fillRule)
30 Qt::FillRule QPainterPath::fillRule() const
31 // 13 从当前位置添加一条直线到给定端点
32 void QPainterPath::lineTo(const QPointF &endPoint)
33 void QPainterPath::lineTo(qreal x, qreal y)
34 // 14 将当前点移动到给定的点,隐式地启动一个新的子路径并关闭前一个。
35 void QPainterPath::moveTo(const QPointF &point)
36 void QPainterPath::moveTo(qreal x, qreal y)
37 // 15 返回指定长度len处的整个路径的百分比。
38 qreal QPainterPath::percentAtLength(qreal len) const
39 // 16 返回当前路径百分比t处的点。参数t必须在O和1之间。
40 QPointF QPainterPath::pointAtPercent(qreal t) const
41 // 17 在当前位置和给定端点之间添加一条二次贝塞尔曲线,控制点由c指定。
42 void QPainterPath::quadTo(const QPointF &c, const QPointF &endPoint)
43 void QPainterPath::quadTo(qreal cx, qreal cy, qreal endPointX, qreal endPointY)
44 // 18 返回此路径的简化版本 (合并版本)
45 QPainterPath QPainterPath::simplified() const
46 // 19 用这个绘制器路径交换其他绘制器路径。这个操作非常快,而且从不失败。
47 void QPainterPath::swap(QPainterPath &other)
48 // 20 创建并返回路径的反向副本。
49 QPainterPath QPainterPath::toReversed() const
1 // 1 设置用于填充用这支笔生成的笔画的笔刷为给定的笔刷。
2 void QPen::setBrush(const QBrush &brush)
3 QBrush QPen::brush() const
4 // 2 将笔样式设置为给定的样式。正方形线的终点、圆形线的终点
5 void QPen::setCapStyle(Qt::PenCapStyle style)
6 Qt::PenCapStyle QPen::capStyle() const
7 // 3 将这支笔的笔刷的颜色设置为给定的颜色。
8 void QPen::setColor(const QColor &color)
9 QColor QPen::color() const
10 // 4 根据彩妆值将此笔设置为彩妆或非彩妆。
11 void QPen::setCosmetic(bool cosmetic)
12 // 5 设置笔的偏移量
13 void QPen::setDashOffset(qreal offset)
14 // 6 将该笔的横线模式设置为给定的模式。(画出来的线是虚实结合的线,线长由参数控制)
15 void QPen::setDashPattern(const QVector
16 // 7 将笔的连接样式设置为给定的样式 (折线,折点处的样式,锐角、钝角、圆角)
17 void QPen::setJoinStyle(Qt::PenJoinStyle style)
18 // 8 将钢笔样式设置为给定的样式 实线、线段线、点线、线段与点结合线 等
19 void QPen::setStyle(Qt::PenStyle style)
20 // 9 以整数精度将笔的宽度设置为给定的像素宽度。
21 void QPen::setWidth(int width)
22 // 10 以浮点精度将笔的宽度设置为给定的像素宽度。
23 void QPen::setWidthF(qreal width)
1 // 1 创建新的类 MyItem2 继承 QGraphicsPathItem,重新实现点击、悬浮等函数
2
3 // myitem2.h
4 #ifndef MYITEM2_H
5 #define MYITEM2_H
6
7 #include
8 #include
9 #include
10
11 // 点击该控件时,调用该函数
12 typedef void (*ClickHandle)(int type,void *other);
13
14 class MyItem2 : public QGraphicsPathItem
15 {
16
17 public:
18 explicit MyItem2(QGraphicsItem *parent = nullptr);
19
20 protected:
21 // 重新实现这些函数
22 void keyPressEvent(QKeyEvent *event);
23 void mousePressEvent(QGraphicsSceneMouseEvent *event);
24 void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
25 void hoverLeaveEvent (QGraphicsSceneHoverEvent * event);
26 void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
27 void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
28 public:
29
30 void setID(int ID);
31 void setClicKHandle(ClickHandle click,void * other);
32 QPainterPath path;
33 private:
34 int ID;
35 ClickHandle click;
36 void * other;
37 QPen pen;
38
39 };
40
41 #endif // MYITEM2_H
1 #include "myitem2.h"
2 #include
3
4 QPainterPath path;
5
6 MyItem2::MyItem2(QGraphicsItem *parent) : QGraphicsPathItem(parent)
7 {
8 this->setAcceptHoverEvents(true);
9 }
10
11 void MyItem2::keyPressEvent(QKeyEvent *event)
12 {
13 // qDebug() <<"键盘按下";
14 }
15 void MyItem2::mousePressEvent(QGraphicsSceneMouseEvent *event)
16 {
17 // qDebug() <<"鼠标按下";
18 pen.setColor(QColor(0,0,128,150));
19 pen.setWidth(6);
20 this->setPen(pen);
21 click(ID,other);
22 }
23 void MyItem2::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
24 {
25 // qDebug() <<"鼠标进入";
26 pen.setColor(QColor(138,43,226,200));
27 pen.setWidth(6);
28 this->setPen(pen);
29 }
30 void MyItem2::hoverLeaveEvent (QGraphicsSceneHoverEvent * event)
31 {
32 // qDebug() <<"鼠标离开";
33 pen.setColor(QColor(138,43,226,150));
34 pen.setWidth(4);
35 this->setPen(pen);
36 }
37 void MyItem2::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
38 {
39 // qDebug() <<"鼠标右键松开";
40 }
41 void MyItem2::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
42 {
43 // qDebug() <<"鼠标移动";
44 }
45
46 void MyItem2::setID(int ID)
47 {
48 this->ID = ID;
49 }
50
51 void MyItem2::setClicKHandle(ClickHandle click,void * other)
52 {
53 this->click = click;
54 this->other = other;
55 }