目的:自定义QGraphicsItem ,鼠标进出时,显示不同颜色
补充:
QGraphicsItem的mouseMoveEvent()函数必须鼠标按下的情况下进行move才会触发。
QWidget的mouseMoveEvent()函数可以通过设置setMouseTracking(true)在鼠标不需要按下的情况下,触发鼠标move事件。
QGraphicsItem要实现鼠标不按下的情况下,获取鼠标move事件,可通过**hoverMoveEvent()来实现,可通过设置setAcceptHoverEvents(true)**使其生效
circle.h
#ifndef CIRCLE_H#define CIRCLE_H#include <QGraphicsObject>#include <QGraphicsEllipseItem>#include <QGraphicsSceneContextMenuEvent>#include <QGraphicsObject>#include <QPainter>class circle : public QGraphicsObject{Q_OBJECTpublic:explicit circle();~circle();protected:QRectF boundingRect() const;void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);QPainterPath shape() const;void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);void hoverEnterEvent(QGraphicsSceneHoverEvent *event);void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);private:int width_ = 100;int height_ = 100;bool isSelect_ =false;};#endif // CIRCLE_H
circle.cpp
#include "circle.h"#include <QMenu>#include <QPen>#include <QPainter>circle::circle(){setAcceptHoverEvents(true);//设置鼠标悬浮可以用}circle::~circle(){}QRectF circle::boundingRect() const{return QRectF(0,0,width_,height_);}void circle::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){Q_UNUSED(option)Q_UNUSED(widget)QPen pen;pen.setWidth(2);if(isSelect_){pen.setColor(QColor(Qt::red));}else{pen.setColor(QColor(Qt::green));}painter->setPen(pen);painter->drawEllipse(0,0,width_,height_);clipPath();}QPainterPath circle::shape() const//返回一个圆形边界线,不然鼠标会在矩形范围内就已经响应鼠标{QPainterPath path;path.addEllipse(boundingRect());return path;}void circle::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){QMenu menu;menu.addAction(QStringLiteral("其他信息1"));menu.addAction(QStringLiteral("其他信息2"));menu.addAction(QStringLiteral("其他信息3"));menu.addAction(QStringLiteral("其他信息4"));menu.exec(event->screenPos());//connect(menu, SIGNAL(triggered(QAction *)),object, SLOT(triggered(QAction *)));}void circle::hoverEnterEvent(QGraphicsSceneHoverEvent *event){setToolTip(QStringLiteral("右键详细信息").arg("id"));isSelect_ = true;update();}void circle::hoverLeaveEvent(QGraphicsSceneHoverEvent *event){isSelect_ = false;update();}