Grapevine View绘图框架(二)实时显示鼠标的位置坐标

QGraphicsView 类中没有与鼠标有关的响应函数,需要自己添加。

//鼠标移动事件响应函数
void mouseMoveEvent(QMouseEvent *event);
//鼠标按键按下事件响应函数
void mousePressEvent(QMouseEvent *event);
//鼠标按键松开事件响应函数
void mouseReleaseEvent(QMouseEvent *event);
//鼠标双击事件响应函数
void mouseDoubleClickEvent(QMouseEvent *event);

1、新建一个类myQGraphicsView 继承QGraphicsView类。
1.1 在 项目 视图中当前项目上右击鼠标,选择 “Add New…”
1.2 弹出的对话框选择 C++ Class
在这里插入图片描述
1.3 基类先选择 QObject类 ,后面在程序里面修改为QGraphicsView类
在这里插入图片描述
1.4 在myQGraphicsView.h修改如下内容
在这里插入图片描述
前两处QObject修改为 QGraphicsView
第三处修改为 QWidget
在这里插入图片描述
1.5 在myQGraphicsView.c修改如下内容
在这里插入图片描述
2、设计ui界面
放置一个Graphics View控件,用于画图;
放置 label 标签,用于显示坐标。
在这里插入图片描述
3、将UI界面提升为 myQGraphicsView类
3.1、在Graphics View控件上右击,选择 “提升为…”
在这里插入图片描述
在这里插入图片描述
4、添加程序
在 myQGraphicsView.h 中

添加头文件

#include <QPoint>
#include <QMouseEvent>

重定义鼠标移动事件响应函数

void mouseMoveEvent(QMouseEvent *event);

定义信号 将鼠标坐标通过信号槽传递

void mousemove_signal(QPoint point);

myQGraphicsView.h

#ifndef MYQGRAPHICSVIEW_H
#define MYQGRAPHICSVIEW_H

#include <QGraphicsView>
#include <QPoint>
#include <QMouseEvent>

class myQGraphicsView : public QGraphicsView
{
    Q_OBJECT
public:
    explicit myQGraphicsView(QWidget *parent = nullptr);
protected:
    void mouseMoveEvent(QMouseEvent *event);
signals:
    void mousemove_signal(QPoint point);
public slots:
};
#endif // MYQGRAPHICSVIEW_H

在 myQGraphicsView.c 中重写 鼠标移动事件响应函数

void myQGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
    QPoint point = event->pos();
    emit mousemove_signal(point);
}

5、在窗口类中接受信号

//     鼠标变成十字光标
    ui->graphicsView->setCursor(Qt::CrossCursor);
    
//    启用鼠标跟踪,即使没有按下按钮,也会接收鼠标移动事件。
    ui->graphicsView->setMouseTracking(true);
    
    ui->graphicsView->setDragMode(QGraphicsView::RubberBandDrag);
    
//    默认坐标系y轴向下为正,将y轴调整为向上为正
    ui->graphicsView->scale(1,-1);
    
//    实现信号槽,接受鼠标坐标 
    connect(ui->graphicsView, &myQGraphicsView::mousemove_signal , this , &DesignWidget::deal_mousemove_signal);

槽函数的实现

void DesignWidget::deal_mousemove_signal(QPoint point)
{
//    显示view下的坐标
    ui->view_label->setText(QString::asprintf("%d , %d",point.x(),point.y()));
    
//    转换到Scene坐标
    QPointF pointScene=ui->graphicsView ->mapToScene(point);
    ui->scene_label->setText(QString::asprintf("%.0f , %.0f", pointScene.x(),pointScene.y()));
}

程序运行结果
当鼠标在Graphics View控件框内移动时,下面会对应显示鼠标实时的坐标。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值