QGraphicsItem 自定义笔记

目的:自定义QGraphicsItem ,鼠标进出时,显示不同颜色

补充:

QGraphicsItem的mouseMoveEvent()函数必须鼠标按下的情况下进行move才会触发。
QWidgetmouseMoveEvent()函数可以通过设置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_OBJECT
public:
    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();
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值