在QChartView的坐标系中获取鼠标坐标

12

有没有一种方法可以获得在QChartView的绘图区域上的鼠标坐标?最好是使用轴单位。目标是在鼠标移动时显示鼠标坐标,以便用户可以测量绘制的对象。

我找不到任何内置函数来实现这一点在QChartView上,所以我尝试使用QChartView::mouseMoveEvent(QMouseEvent *event)来尝试计算绘图区域中的结果位置。问题是我无法获取任何对于绘图区域坐标系的参考。

我已经尝试使用mapToScenemapToItemmapToParent,并且在所有我能够获取的对象上反向使用mapFrom...来尝试实现这一点,但都没有成功。

我发现QChartView::chart->childItems()[2]确实是绘图区域,不包括轴和轴标签。然后我可以调用QChartView::chart->childItems()[2]->setCursor(Qt::CrossCursor)让十字光标只出现在绘图区域而不是相邻的对象上。但是,无论我尝试什么,似乎都没有正确地参考到该对象的坐标系。

1个回答

16

QChartView是一个带有嵌入scene()QGraphicsView。要获得任何图表内的坐标,您需要经过几个坐标变换:

  1. 从视图窗口坐标开始
  2. view->mapToScene: widget (view) 坐标 → 场景坐标
  3. chart->mapFromScene: 场景坐标 → 图表项坐标
  4. chart->mapToValue: 图表项坐标 → 给定系列中的值。
  5. 以给定系列中的值坐标结束。

术语“图表项”和“图表部件”是同义词,因为QChart is-a QGraphicsWidget is-a QGraphicsItem。请注意,QGraphicsWidget不是QWidget

像这样实现就能完美运行(感谢Marcel!):

auto const widgetPos = event->localPos();
auto const scenePos = mapToScene(QPoint(static_cast<int>(widgetPos.x()), static_cast<int>(widgetPos.y()))); 
auto const chartItemPos = chart()->mapFromScene(scenePos); 
auto const valueGivenSeries = chart()->mapToValue(chartItemPos); 
qDebug() << "widgetPos:" << widgetPos; 
qDebug() << "scenePos:" << scenePos; 
qDebug() << "chartItemPos:" << chartItemPos; 
qDebug() << "valSeries:" << valueGivenSeries;

那似乎是正确的坐标映射组合。我最终做的是子类化QChartView并在QChartView::mouseMoveEvent()中实现了chart()->mapToValue(),这立即起作用了。子类化对于实现缩放和平移也非常有用。 - A. Vieira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接