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控件框内移动时,下面会对应显示鼠标实时的坐标。