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
Grapevine View绘图框架(二)实时显示鼠标的位置坐标_第1张图片
1.3 基类先选择 QObject类 ,后面在程序里面修改为QGraphicsView类
Grapevine View绘图框架(二)实时显示鼠标的位置坐标_第2张图片
1.4 在myQGraphicsView.h修改如下内容
Grapevine View绘图框架(二)实时显示鼠标的位置坐标_第3张图片
前两处QObject修改为 QGraphicsView
第三处修改为 QWidget
Grapevine View绘图框架(二)实时显示鼠标的位置坐标_第4张图片
1.5 在myQGraphicsView.c修改如下内容
Grapevine View绘图框架(二)实时显示鼠标的位置坐标_第5张图片
2、设计ui界面
放置一个Graphics View控件,用于画图;
放置 label 标签,用于显示坐标。
Grapevine View绘图框架(二)实时显示鼠标的位置坐标_第6张图片
3、将UI界面提升为 myQGraphicsView类
3.1、在Graphics View控件上右击,选择 “提升为…”
Grapevine View绘图框架(二)实时显示鼠标的位置坐标_第7张图片
Grapevine View绘图框架(二)实时显示鼠标的位置坐标_第8张图片
4、添加程序
在 myQGraphicsView.h 中

添加头文件

#include 
#include 

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

void mouseMoveEvent(QMouseEvent *event);

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

void mousemove_signal(QPoint point);

myQGraphicsView.h

#ifndef MYQGRAPHICSVIEW_H
#define MYQGRAPHICSVIEW_H

#include 
#include 
#include 

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控件框内移动时,下面会对应显示鼠标实时的坐标。
Grapevine View绘图框架(二)实时显示鼠标的位置坐标_第9张图片

你可能感兴趣的:(Qt)