当前位置:   article > 正文

【Qt系列】实时显示鼠标位于QGraphicsView或QGraphicsScene坐标点_qt获取qgraphicsview当前坐标

qt获取qgraphicsview当前坐标

演示效果

在这里插入图片描述
坐标点的显示在右下角。

前言

在Graphics View框架结构主要包含三个类:场景类(QGraphicsScene)、视图类(QGraphicsView)和图元类(QGraphicsItem),统称为“三要素”。这三要素都有自己的坐标系,各个坐标系之间可以相互转换。这次博客主要实现的就是展现鼠标在其中两个坐标系的坐标点。

场景坐标

场景坐标是所有图元的基础坐标系统。场景坐标系统描述了顶层图元的位置,并且构成从视图传播到场景的所有场景事件的基础。每个图元在场景上都有场景坐标和边界矩形。场景坐标的原点在场景中心,坐标原点是X轴正方向向右,Y轴正方向向下。
在这里插入图片描述

视图坐标

视图坐标是窗口部件的坐标,视图坐标的单位是像素,QGraphicsView的左上角是(0,0)。所有鼠标事件、拖拽事件最开始都使用视图坐标,为了和图元交互,需要转换坐标为场景坐标。
在这里插入图片描述

代码讲解

class AgvView : public QGraphicsView
{
public:
    AgvView();

    QLabel *scenePointDispaly = new QLabel;

protected:
    void mouseMoveEvent(QMouseEvent *event);    //鼠标移动事件

private:
    QPointF scenePoint;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

首先我们要新建一个类,这个新的类是基于QGraphicsView类的,继承了它的功能。然后我们要重新编写mouseMoveEvent函数,即鼠标移动函数,这是个虚函数,我们可以重新定义它的功能。

这个mouseMoveEvent函数是继承自QWidget类的虚函数,凡是继承自QWidget类的子类都可以重新实现该函数,去接收在控件上的鼠标移动事件。基本上大多数控件都是继承自QWidget类的。

//鼠标移动事件
void AgvView::mouseMoveEvent(QMouseEvent *event)
{
    //QGraphicsView坐标
    QPoint viewPoint = event->pos();

    //QGraphicsScene坐标
    scenePoint = mapToScene(viewPoint);
    setMouseTracking(true);
    scenePointDispaly->setText("("+QString::number(scenePoint.x())+","+QString::number(scenePoint.y())+")");
 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

实现代码也很简单,event事件有个pos函数,返回此时鼠标所在的位置,返回数据类型是QPoint。因为该鼠标事件位于View事件,所以pos函数返回的也是相对于View坐标系的坐标点。如果是需要显示View坐标坐标点,那这个用这个参数就可以了。

也可以通过mapToScene函数,将View坐标点映射到Scene坐标系,得到Scene坐标点。最后将对应坐标点的x和y展示在QLabel标签上。

QLabel标签是类声明的public属性的控件,以便可以添加到布局里面显示。当然也有其他方法显示,反正数据scenePoint就在那。

setMouseTracking函数主要是设置是否开启鼠标跟踪。如果鼠标跟踪失能(默认情况),只有鼠标其中一个按键按下且移动的时候,控件才会进入鼠标事件。如果鼠标跟踪使能,即使没有按下鼠标,只要移动了,就会进入鼠标事件。

我想要实现的功能是鼠标滑过或者停留在上面,就能显示坐标点,所以选择了使能true。感觉拖拽很不方便。

    QLabel *label1 = new QLabel;
    label1->setText("Scene坐标点:");
    tab3LayoutR->addWidget(label1);      //添加两个文本控件
    tab3LayoutR->addWidget(view->scenePointDispaly);
  • 1
  • 2
  • 3
  • 4

将这个标签QLabel添加到主界面其中一个布局就可以了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/91722
推荐阅读
相关标签
  

闽ICP备14008679号