赞
踩
坐标点的显示在右下角。
在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;
};
首先我们要新建一个类,这个新的类是基于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())+")");
}
实现代码也很简单,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);
将这个标签QLabel添加到主界面其中一个布局就可以了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。