QGraphicsItem的使用

如何在设计界面中添加QGraphicsView控件?

1 打开设计界面,点开Display 	Widgets,将Graphics Widget 控件拖动到界面上即可。

QGraphicsView组成单元

-QGraphicsView(视图)
---QGraphicsScene(场景)
-----QGraphicsItem(图元)  

    
QGraphicsView提供一个可视的窗口,用于显示场景中的图元,一个场景中可以有多个视图。    
QGraphicsScene本身不可见,是一个存储图元的容器,必须通过与之相连的QGraphicsView视图来显示及与外界进行交互,主要提供图元的操作接口、传递事件和管理各个图元状态。
QGraphicsItem是场景中各个图元的基础类。    
QGraphicsItem图元主要特性如下: 
A、支持鼠标按下、移动、释放、双击、悬停、滚动和右键菜单事件。 
B、支持键盘输入焦点和按键事件 
C、支持拖拽事件
D、支持分组,使用父子关系和QGraphicsItemGroup
E、支持碰撞检测     
    
GraphicsView是一个基于图元的Model/View架构的框架,每一个组件都是一个独立的元素。。GraphicsView绘图时首先创建一个场景,然后创建图元对象(如一个直线对象、一个多边形对象),再使用场景的add()函数,将图元对象添加到场景中,最后通过视图进行显示。对于复杂的图像来说,如果图像包含大量的直线、曲线、多边形等图元对象,管理图元对象比管理QPainter的绘制过程语句要容易,并且图元对象更符合面向对象的思想,图形的可复用性更好。  

QGraphicsView类方法

// 1 返回位置为 QPoint 的项,如果有多项,则返回最上面那个项
QGraphicsItem *itemAt(const QPoint &pos) const
// 2 返回关联场景中的所有项
QList<QGraphicsItem *> items() const
// 3 返回有Rect包含或与Rect相交的所有项的列表、这些项按堆叠顺序排列(第一项是最上面的项)    
QList<QGraphicsItem *> items(const QRect &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
QList<QGraphicsItem *> items(int x, int y, int w, int h, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
// 4 返回当前视图中的场景,如过没有,返回nullptr
QGraphicsScene *scene() const
// 5 设置场景的可视化区域 (超出的部分,会出现滚动条)
void setSceneRect(const QRectF &rect)
void setSceneRect(qreal x, qreal y, qreal w, qreal h)
// 6 设置场景在视图中的对齐方式,默认为居中对齐
void setAlignment(Qt::Alignment alignment)
// 7 设置视图中的场景背景笔刷    
QBrush backgroundBrush() const
void setBackgroundBrush(const QBrush &brush)
// 8 设置场景可否被鼠标左键拖动,默认无法被拖动
QGraphicsView::DragMode dragMode() const
void setDragMode(QGraphicsView::DragMode mode)
// 9 设置前景笔刷
QBrush foregroundBrush() const
void setForegroundBrush(const QBrush &brush)
// 10 是否运行场景交互(响应鼠标事件)    
bool isInteractive() const
void setInteractive(bool allowed)
// 11 设置场景
void setScene(QGraphicsScene *scene)

QGraphicsScene类方法

// 1 添加子项目
void QGraphicsScene::addItem(QGraphicsItem *item)      
// 2 移除子项目
void QGraphicsScene::removeItem(QGraphicsItem *item)
// 3 添加直线项   
QGraphicsLineItem *QGraphicsScene::addLine(const QLineF &line, const QPen &pen = QPen())
QGraphicsLineItem *QGraphicsScene::addLine(qreal x1, qreal y1, qreal x2, qreal y2, const QPen &pen = QPen())
// 4 添加椭圆项
QGraphicsEllipseItem *addEllipse(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush())
QGraphicsEllipseItem *addEllipse(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
// 5 添加路径项
QGraphicsPathItem *QGraphicsScene::addPath(const QPainterPath &path, const QPen &pen = QPen(), const QBrush &brush = QBrush())
// 6 添加图片项
QGraphicsPixmapItem *QGraphicsScene::addPixmap(const QPixmap &pixmap)    
// 7 添加矩形项
QGraphicsRectItem *addRect(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush())
QGraphicsRectItem *addRect(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
// 8 添加文本项
QGraphicsTextItem *QGraphicsScene::addText(const QString &text, const QFont &font = QFont())
// 9 添加多边形项
QGraphicsPolygonItem *addPolygon(const QPolygonF &polygon, const QPen &pen = QPen(), const QBrush &brush = QBrush())
// 9 添加装置项  
QGraphicsProxyWidget *QGraphicsScene::addWidget(QWidget *widget, Qt::WindowFlags wFlags = Qt::WindowFlags())
// 10 设置场景的背景画刷
QBrush backgroundBrush() const
// 11 清除焦点
void clearFocus()   
// 12 获取与选定项目包含或相交的项
QList<QGraphicsItem *> collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const  
// 13 将一些项添加到一个分组中,并返回该分组的指针
QGraphicsItemGroup *QGraphicsScene::createItemGroup(const QList<QGraphicsItem *> &items)
// 14 拆除分组
void QGraphicsScene::destroyItemGroup(QGraphicsItemGroup *group)
// 15 设置字体   会触发 FontChange 信号
QFont font() const
void setFont(const QFont &font)
// 16 设置前景笔刷
QBrush foregroundBrush() const
void setForegroundBrush(const QBrush &brush)
// 17 获取场景的高度
qreal height() const
// 18 获取场景的宽度
qreal width() const
// 19 查看场景是否是活动的
bool isActive() const   
// 20 返回位置为 QPoint 的项,如果有多项,则返回最上面那个项
QGraphicsItem *itemAt(const QPointF &position, const QTransform &deviceTransform) const  
QGraphicsItem *itemAt(qreal x, qreal y, const QTransform &deviceTransform) const
// 21 返回场景中的所有项
QList<QGraphicsItem *> items(Qt::SortOrder order = Qt::DescendingOrder) const 
// 22 返回场景中的所有与该点相交的项
QList<QGraphicsItem *> items(const QPointF &pos, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const
// 23 返回有Rect包含或与Rect相交的所有项的列表、这些项按堆叠顺序排列(第一项是最上面的项)    
QList<QGraphicsItem *> items(const QRectF &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const
// 24 返回场景中的所有与该路径相交的项 
QList<QGraphicsItem *> items(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const
// 25 返回场景中正在被鼠标抓取的项目(正在拖动的项目?)
QGraphicsItem *mouseGrabberItem() const
// 26 移除所有项目
void removeItem(QGraphicsItem *item)
// 27 设置场景范围
QRectF sceneRect() const
void setSceneRect(const QRectF &rect)
void setSceneRect(qreal x, qreal y, qreal w, qreal h)
// 28 事件过滤器
bool QGraphicsScene::sendEvent(QGraphicsItem *item, QEvent *event)    
// 29 激活项目\部件
void setActivePanel(QGraphicsItem *item)
void setActiveWindow(QGraphicsWidget *widget)
// 30 设置场景的背景画刷
QBrush backgroundBrush() const
void setBackgroundBrush(const QBrush &brush)
// 31 设置调色板
QPalette palette() const
void setPalette(const QPalette &palette)
// 32 设置样式
void setStyle(QStyle *style)
QStyle *style() const
// 33 返回所有包含此场景的视图
QList<QGraphicsView *> views() const    
// 34 尚不清楚
void update(qreal x, qreal y, qreal w, qreal h)    

QGraphicsItem类方法

// 1 设置拖动事件,默认为不接受
void QGraphicsItem::setAcceptDrops(bool on);
bool QGraphicsItem::acceptDrops() const 
// 2 设置悬浮事件,默认为不接受
void QGraphicsItem::setAcceptHoverEvents(bool enabled)    
bool QGraphicsItem::acceptHoverEvents() const
// 2.1 悬停进入,默认实现调用 updata
void QGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
// 2.2 悬停移动
void QGraphicsItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
// 2.3 悬停离开,默认实现调用 updata
void QGraphicsItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
// 3 设置触摸事件,默认为不接受
void QGraphicsItem::setAcceptTouchEvents(bool enabled)
bool QGraphicsItem::acceptTouchEvents() const    
// 4 设置该项接受鼠标事件的鼠标按钮,默认情况是接受的,如果不接受,鼠标事件传递到下面一项Item
void QGraphicsItem::setAcceptedMouseButtons(Qt::MouseButtons buttons)    
Qt::MouseButtons QGraphicsItem::acceptedMouseButtons() const    
// 5 设置活动状态
void QGraphicsItem::setActive(bool active)    
// 6 设置边界的粒度,范围0~1,默认为0最低粒度 
void QGraphicsItem::setBoundingRegionGranularity(qreal granularity)    
qreal QGraphicsItem::boundingRegionGranularity() const    
// 7 设置光标
void setCursor(const QCursor &cursor)
// 8 设置属性 
void QGraphicsItem::setData(int key, const QVariant &value)
QVariant QGraphicsItem::data(int key) const    
// 9 是否禁用,默认false,不禁用
void QGraphicsItem::setEnabled(bool enabled)    
bool QGraphicsItem::isEnabled() const  
// 10 是否过滤子item事件,默认为false,不过滤,当设置为true时,所有子item事件在父item触发
void QGraphicsItem::setFiltersChildEvents(bool enabled)    
bool QGraphicsItem::filtersChildEvents() const        
// 11 设置标志
void setFlag(QGraphicsItem::GraphicsItemFlag flag, bool enabled = true)
void setFlags(QGraphicsItem::GraphicsItemFlags flags)
// 12 设置键盘焦点    
void QGraphicsItem::setFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason)    
// 13 设置代理焦点
void QGraphicsItem::setFocusProxy(QGraphicsItem *item)   
// 14 设置效果  模糊、不透明度、颜色阴影等    
void QGraphicsItem::setGraphicsEffect(QGraphicsEffect *effect)
// 15 添加到组中
void QGraphicsItem::setGroup(QGraphicsItemGroup *group)    
// 16 为输入法设置提升
void QGraphicsItem::setInputMethodHints(Qt::InputMethodHints hints)    
// 17 设置不透明度,范围为 0~1 ,默认为传递到子组件中    
void QGraphicsItem::setOpacity(qreal opacity)   
qreal QGraphicsItem::effectiveOpacity() const    
// 18 设置是否可见    
void QGraphicsItem::setVisible(bool visible)    
// 19 设置模式  是否阻塞父、父父。。。 等面板的输入
void QGraphicsItem::setPanelModality(QGraphicsItem::PanelModality panelModality)  
QGraphicsItem::PanelModality QGraphicsItem::panelModality() const
// 20 设置父项(将从旧父项child中移除) 查看父|子项
void QGraphicsItem::setParentItem(QGraphicsItem *newParent)  
QGraphicsItem *QGraphicsItem::parentItem() const
QGraphicsObject *QGraphicsItem::parentObject() const    
QGraphicsWidget *QGraphicsItem::parentWidget() const
QList<QGraphicsItem *> QGraphicsItem::childItems() const    
// 21 设置坐标
void QGraphicsItem::setPos(const QPointF &pos)
void QGraphicsItem::setPos(qreal x, qreal y)    
QPointF QGraphicsItem::pos() const    
// 22 设置旋转角度  -360~360
void QGraphicsItem::setRotation(qreal angle)    
qreal QGraphicsItem::rotation() const    
// 23 设置项的比例因子  成倍的放大或缩小
void QGraphicsItem::setScale(qreal factor)    
qreal QGraphicsItem::scale() const    
// 24 设置是否被选中(前提为可选)
void QGraphicsItem::setSelected(bool selected)
// 25 设置工具提示
void QGraphicsItem::setToolTip(const QString &toolTip) 
QString QGraphicsItem::toolTip() const    
// 26 设置转换矩阵
void QGraphicsItem::setTransform(const QTransform &matrix, bool combine = false)  
QTransform QGraphicsItem::transform() const      
QTransform QGraphicsItem::deviceTransform(const QTransform &viewportTransform) const    
// 27 在项坐标中设置转换的原点。 
void QGraphicsItem::setTransformOriginPoint(const QPointF &origin) 
void QGraphicsItem::setTransformOriginPoint(qreal x, qreal y)    
QPointF QGraphicsItem::transformOriginPoint() const    
// 28 设置动画列表
void QGraphicsItem::setTransformations(const QList<QGraphicsTransform *> &transformations)    
// 29 设置堆叠顺序,高的项总在低的项上面
void QGraphicsItem::setZValue(qreal z)   
// 30 以路径的形式返回项的形状
QPainterPath QGraphicsItem::shape() const
// 31 返回图形项    
QGraphicsObject *QGraphicsItem::toGraphicsObject()    
// 32 返回最顶层的父项(祖先项),如果没有父项,则返回自己
QGraphicsItem *QGraphicsItem::topLevelItem() const    
// 33 返回最顶层的父项Widget
QGraphicsWidget *QGraphicsItem::topLevelWidget() const      
// 34 设置在其它项之上  (z值相同时,才能生效)  
void QGraphicsItem::stackBefore(const QGraphicsItem *sibling)
// 35 释放键盘抓取
void QGraphicsItem::ungrabKeyboard()
// 36 释放鼠标抓取
void QGraphicsItem::ungrabMouse()
// 37 清除该项中的游标。   
void QGraphicsItem::unsetCursor()    
// 38 计划重绘这个项目中由rect覆盖的区域。
void QGraphicsItem::update(const QRectF &rect = QRectF()) 
void QGraphicsItem::update(qreal x, qreal y, qreal width, qreal height)    
// 39 返回项目的窗口,如果该项目没有窗口,则返回nullptr。
QGraphicsWidget *QGraphicsItem::window() const    
// 40 返回重绘的矩形(虚函数,需自己实现)
QRectF QGraphicsItem::boundingRect() const    
// 41 返回该项的边界区域    
QRegion QGraphicsItem::boundingRegion(const QTransform &itemToDeviceTransform) const   
// 42 将项目的缓存模式设置为模式。默认无缓存
void QGraphicsItem::setCacheMode(QGraphicsItem::CacheMode mode, const QSize &logicalCacheSize = QSize())    
QGraphicsItem::CacheMode QGraphicsItem::cacheMode() const     
// 43 返回该项子项的边界矩形。
QRectF QGraphicsItem::childrenBoundingRect() const 
// 44 返回该项目的剪辑路径, 
QPainterPath QGraphicsItem::clipPath() const
// 45 判断该项在某种重叠方式下是否与其他项重叠
bool QGraphicsItem::collidesWithItem(const QGraphicsItem *other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
// 46 判断该项在某种重叠方式下是否与路径重叠
bool QGraphicsItem::collidesWithPath(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
// 47 返回所有与该项重叠的项
QList<QGraphicsItem *> QGraphicsItem::collidingItems(Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const    
// 48 返回此项和其他项的最接近的公共祖先项
QGraphicsItem *QGraphicsItem::commonAncestorItem(const QGraphicsItem *other) const    
// 49 如果该项包含点则返回true。
virtual bool contains(const QPointF &point) const
// 50 设置标志
void QGraphicsItem::setFlags(QGraphicsItem::GraphicsItemFlags flags)    
void QGraphicsItem::setFlag(QGraphicsItem::GraphicsItemFlag flag, bool enabled = true)    
QGraphicsItem::GraphicsItemFlags QGraphicsItem::flags() const    
// 51 水平移动
void QGraphicsItem::moveBy(qreal dx, qreal dy) 
// 52 这个虚函数返回一个表示该项不透明区域的形状。
QPainterPath QGraphicsItem::opaqueArea() const    
// 53 返回项的面板,如果该项没有面板,则返回nullptr。我的项目是一个面板,它将返回本身。否则,它将返回最近的前面板。   
QGraphicsItem *QGraphicsItem::panel() const    
// 54 返回该项的当前场景,如果该项没有存储在场景中,则返回nullptr    
QGraphicsScene *QGraphicsItem::scene() const    
// 55 返回该项目在场景坐标中的边界矩形,
QRectF QGraphicsItem::sceneBoundingRect() const    
// 56 返回项目在场景坐标中的位置。    
QPointF QGraphicsItem::scenePos() const    
// 57 通过dx, dy滚动rect的内容。如果rect是一个空矩形(默认),项目的边界矩形会滚动。    
void QGraphicsItem::scroll(qreal dx, qreal dy, const QRectF &rect = QRectF())    
// 58 设置此项目的笔。
void QAbstractGraphicsShapeItem::setPen(const QPen &pen)    
// 59 设置项目的笔刷为笔刷。
void QAbstractGraphicsShapeItem::setBrush(const QBrush &brush)    

简单demo

// .h
#include <QGraphicsView>
#include <QGraphicsItem>

QGraphicsView * graphicsView;				// 定义视图
QGraphicsScene graphicsScene;				// 定义场景
QGraphicsPathItem graphicsPathItem;			// 定义路径类图元
QPainterPath path;							// 定义路径
QPen pen;									// 定义画笔
// .cpp
graphicsView = ui->graphicsView;			// 获取UI上的视图
graphicsView->setScene(&graphicsScene);		// 将场景添加到视图中

pen.setColor(QColor(0,0,128,150));			// 设置画笔颜色
pen.setWidth(6);							// 设置画笔宽度	
graphicsPathItem->setPen(pen);				// 图元绑定画笔 

path.addRect(0,0,60,60);					// 在路径中添加矩形
path.addText(QPoint(0,30),QFont("微软雅黑", 15, QFont::Thin),"电台一");	// 在路径中添加文字

graphicsPathItem.setPath(path);				// 将路径添加到图元中
graphicsScene.addItem(&graphicsPathItem);	// 将图元添加到场景中


/*-----------------------------------  更新视图的方式  -------------------------------------*/
// 只需更新图元即可
path.addRect(20,20,60,60);				// 更新路径
graphicsPathItem.setPath(path);			// 更新图元

QPainterPath类方法

// 1 在指定的边界矩形内创建一个椭圆,并将其作为封闭的子路径添加到画家路径中。
void QPainterPath::addEllipse(const QRectF &boundingRectangle)
void QPainterPath::addEllipse(qreal x, qreal y, qreal width, qreal height)    
// 2 将给定的路径作为封闭的子路径添加到此路径。
void QPainterPath::addPath(const QPainterPath &path)
// 3 将给定的多边形作为(未闭合的)子路径添加到路径中。    
void QPainterPath::addPolygon(const QPolygonF &polygon)    
// 4 将给定的矩形作为封闭的子路径添加到此路径。    
void QPainterPath::addRect(const QRectF &rectangle)    
void QPainterPath::addRect(qreal x, qreal y, qreal width, qreal height)    
// 5 将给定的文本作为一组从提供的字体创建的封闭子路径添加到此路径。
void QPainterPath::addText(const QPointF &point, const QFont &font, const QString &text)    
void QPainterPath::addText(qreal x, qreal y, const QFont &font, const QString &text)    
// 6 以浮点精度的矩形返回此画家路径的边界矩形。
QRectF QPainterPath::boundingRect() const    
// 7 清除存储的路径元素。    
void QPainterPath::clear()    
// 8 通过在子路径的开始处画一条线来关闭当前的子路径,   
void QPainterPath::closeSubpath()  
// 9 通过从路径的最后一个元素添加一行到给定路径的第一个元素,将给定路径连接到此路径。    
void QPainterPath::connectPath(const QPainterPath &path)    
// 10 如果给定点在路径内返回true,否则返回false。
bool QPainterPath::contains(const QPointF &point) const   
bool QPainterPath::contains(const QRectF &rectangle) const    
bool QPainterPath::contains(const QPainterPath &p) const   
// 11 返回路径的当前位置。
QPointF QPainterPath::currentPosition() const    
// 12 将画家路径的填充规则设置为给定的填充规则。Qt提供了两种填充路径的方法:Qt::OddEvenFill (default)  Qt::WindingFill
void QPainterPath::setFillRule(Qt::FillRule fillRule)
Qt::FillRule QPainterPath::fillRule() const    
// 13 从当前位置添加一条直线到给定端点
void QPainterPath::lineTo(const QPointF &endPoint)    
void QPainterPath::lineTo(qreal x, qreal y)
// 14 将当前点移动到给定的点,隐式地启动一个新的子路径并关闭前一个。  
void QPainterPath::moveTo(const QPointF &point)    
void QPainterPath::moveTo(qreal x, qreal y)   
// 15 返回指定长度len处的整个路径的百分比。    
qreal QPainterPath::percentAtLength(qreal len) const    
// 16 返回当前路径百分比t处的点。参数t必须在O和1之间。    
QPointF QPainterPath::pointAtPercent(qreal t) const    
// 17 在当前位置和给定端点之间添加一条二次贝塞尔曲线,控制点由c指定。
void QPainterPath::quadTo(const QPointF &c, const QPointF &endPoint)
void QPainterPath::quadTo(qreal cx, qreal cy, qreal endPointX, qreal endPointY)
// 18 返回此路径的简化版本 (合并版本)
QPainterPath QPainterPath::simplified() const    
// 19 用这个绘制器路径交换其他绘制器路径。这个操作非常快,而且从不失败。
void QPainterPath::swap(QPainterPath &other)    
// 20 创建并返回路径的反向副本。  
QPainterPath QPainterPath::toReversed() const    

QPen类方法

// 1 设置用于填充用这支笔生成的笔画的笔刷为给定的笔刷。
void QPen::setBrush(const QBrush &brush)
QBrush QPen::brush() const  
// 2 将笔样式设置为给定的样式。正方形线的终点、圆形线的终点
void QPen::setCapStyle(Qt::PenCapStyle style)    
Qt::PenCapStyle QPen::capStyle() const    
// 3 将这支笔的笔刷的颜色设置为给定的颜色。
void QPen::setColor(const QColor &color)    
QColor QPen::color() const  
// 4 根据彩妆值将此笔设置为彩妆或非彩妆。 
void QPen::setCosmetic(bool cosmetic)    
// 5 设置笔的偏移量
void QPen::setDashOffset(qreal offset)    
// 6 将该笔的横线模式设置为给定的模式。(画出来的线是虚实结合的线,线长由参数控制)
void QPen::setDashPattern(const QVector<qreal> &pattern)    
// 7 将笔的连接样式设置为给定的样式 (折线,折点处的样式,锐角、钝角、圆角)    
void QPen::setJoinStyle(Qt::PenJoinStyle style)    
// 8 将钢笔样式设置为给定的样式  实线、线段线、点线、线段与点结合线 等
void QPen::setStyle(Qt::PenStyle style)    
// 9 以整数精度将笔的宽度设置为给定的像素宽度。
void QPen::setWidth(int width)    
// 10 以浮点精度将笔的宽度设置为给定的像素宽度。
void QPen::setWidthF(qreal width)    

如何给图元绑定事件?

// 1 创建新的类 MyItem2 继承 QGraphicsPathItem,重新实现点击、悬浮等函数

// myitem2.h
#ifndef MYITEM2_H
#define MYITEM2_H

#include <QGraphicsItem>
#include <QGraphicsSceneEvent>
#include <QPen>

// 点击该控件时,调用该函数
typedef void (*ClickHandle)(int type,void *other);

class MyItem2 : public QGraphicsPathItem
{

public:
    explicit MyItem2(QGraphicsItem *parent = nullptr);

protected:
    // 重新实现这些函数
    void keyPressEvent(QKeyEvent *event);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
    void hoverLeaveEvent (QGraphicsSceneHoverEvent * event);
    void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
public:

    void setID(int ID);
    void setClicKHandle(ClickHandle click,void * other);
    QPainterPath path;
private:
    int ID;
    ClickHandle click;
    void * other;
    QPen pen;

};

#endif // MYITEM2_H
#include "myitem2.h"
#include <QDebug>

QPainterPath path;

MyItem2::MyItem2(QGraphicsItem *parent) : QGraphicsPathItem(parent)
{
    this->setAcceptHoverEvents(true);
}

void MyItem2::keyPressEvent(QKeyEvent *event)
{
//    qDebug() << "键盘按下";
}
void MyItem2::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
//    qDebug() << "鼠标按下";
    pen.setColor(QColor(0,0,128,150));
    pen.setWidth(6);
    this->setPen(pen);
    click(ID,other);
}
void MyItem2::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
//    qDebug() << "鼠标进入";
    pen.setColor(QColor(138,43,226,200));
    pen.setWidth(6);
    this->setPen(pen);
}
void MyItem2::hoverLeaveEvent (QGraphicsSceneHoverEvent * event)
{
//    qDebug() << "鼠标离开";
    pen.setColor(QColor(138,43,226,150));
    pen.setWidth(4);
    this->setPen(pen);
}
void MyItem2::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
//    qDebug() << "鼠标右键松开";
}
void MyItem2::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
//    qDebug() << "鼠标移动";
}

void MyItem2::setID(int ID)
{
    this->ID = ID;
}

void MyItem2::setClicKHandle(ClickHandle click,void * other)
{
    this->click = click;
    this->other = other;
}
  • 20
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值