12

有没有办法在 a 的绘图区域上获取鼠标的坐标QChartView?最好以轴为单位。目标是在绘图上移动鼠标时显示鼠标的坐标,以便用户可以测量绘图对象。

我在 上找不到任何内置函数QChartView,所以我试图用它QChartView::mouseMoveEvent(QMouseEvent *event)来尝试计算绘图区域中的结果位置。问题是我无法获得对绘图区域坐标系的任何参考。我已经尝试在所有我可以抓住的对象上使用mapToScene,mapToItem以及mapToParent相反的方法来尝试执行此操作,但无济于事。mapFrom...

我发现这QChartView::chart->childItems()[2]确实是绘图区域,不包括轴和轴标签。然后我可以调用QChartView::chart->childItems()[2]->setCursor(Qt::CrossCursor)以使十字仅出现在绘图区域而不是相邻对象上。但是,我似乎没有尝试正确引用该对象的坐标系。

4

1 回答 1

14

QChartView只是一个QGraphicsView带有嵌入式的scene(). 要在任何图表中获取坐标,您必须经过几个坐标转换:

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

术语“图表项”和“图表小部件”是同义词,因为QChartis-a QGraphicsWidgetis-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;
于 2017-05-19T20:29:02.163 回答