📜  qt图形场景图光标位置-C++(1)

📅  最后修改于: 2023-12-03 14:46:50.817000             🧑  作者: Mango

Qt图形场景图光标位置

简介

在Qt图形场景图中,光标的位置是一个非常重要的概念,因为它代表了场景中的位置,在绘制和交互中都有用途。光标位置在Qt中有多种表示方法,根据具体情况选择最适合的方法是很重要的。

场景坐标系和视图坐标系

在Qt中,场景(Scene)和视图(View)是两个不同的概念。场景是对象的容器,而视图则是用户与场景交互的窗口。场景和视图有各自的坐标系,称为场景坐标系和视图坐标系。

场景坐标系与视图坐标系之间的关系可以通过视图的matrix()函数获得。

QPointF viewPos = mouseEvent->pos();
QMatrix matrix = view->matrix().inverted();
QPointF scenePos = matrix.map(viewPos);

上面的代码展示了如何将视图坐标系中的鼠标位置转换为场景坐标系中的位置。首先通过mouseEvent->pos()获取鼠标在视图中的位置,然后通过视图的matrix()函数获取视图坐标系与场景坐标系之间的转换矩阵,并通过调用该矩阵的inverted()函数得到逆矩阵。最后,通过调用逆矩阵的map()函数即可将视图坐标系中的位置映射到场景坐标系中。

场景坐标和屏幕坐标

除了场景坐标系和视图坐标系,还有屏幕坐标系(Screen),它是指屏幕上的坐标。在Qt中,可以通过视图的mapToScene()函数和场景的mapToScene()函数将屏幕坐标系中的位置转换为场景坐标系中的位置。

视图的mapToScene()函数可以将视图坐标系中的位置转换为场景坐标系中的位置。

QPointF viewPos = mouseEvent->pos();
QPointF scenePos = view->mapToScene(viewPos);

场景的mapToScene()函数可以将屏幕坐标系中的位置转换为场景坐标系中的位置。

QPoint screenPos = QCursor::pos();
QPointF scenePos = scene->mapToScene(screenPos);

上面的代码展示了如何将鼠标在视图中的位置和屏幕中的位置转换为场景坐标系中的位置。在视图中,使用mapToScene()函数将视图坐标系中的位置转换为场景坐标系中的位置。在场景中,使用mapToScene()函数将屏幕坐标系中的位置转换为场景坐标系中的位置。

光标

在前面的介绍中,我们已经学习了如何将不同坐标系中的位置转换为场景坐标系中的位置,那如何获取光标的位置呢?在Qt中,有两种方式可以获取光标位置,分别是使用QCursor::pos()函数和拦截MouseMove事件。

使用QCursor::pos()函数

QCursor::pos()函数返回当前屏幕坐标系中光标的位置。

QPoint screenPos = QCursor::pos();
QPointF scenePos = scene->mapToScene(screenPos);
拦截MouseMove事件

拦截MouseMove事件可以在每次光标移动时更新光标的位置。我们可以在QGraphicsView中重新实现mouseMoveEvent()函数来拦截MouseMove事件,并在该函数中更新光标位置。

void MyView::mouseMoveEvent(QMouseEvent *event)
{
    // 更新光标在场景坐标系中的位置
    QPointF scenePos = mapToScene(event->pos());
    // ...
}
总结

本文介绍了Qt图形场景图光标位置的相关知识,包括场景坐标系和视图坐标系的关系,以及如何将场景坐标系、视图坐标系和屏幕坐标系之间的位置进行转换。同时,还介绍了如何获取光标的位置,并提供了两种获取光标位置的方式。学习并运用本文介绍的知识,可以方便地获取和使用光标的位置,加快Qt图形应用的开发。