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

时间:2017-05-19 10:35:43

标签: c++ qt qtchart

有没有办法在QChartView的绘图区域上获取鼠标坐标?优选地,在轴单元中。目标是在绘图上移动鼠标时显示鼠标坐标,以便用户可以测量绘制的对象。

我无法在QChartView上找到任何内置函数,因此我尝试使用QChartView::mouseMoveEvent(QMouseEvent *event)来尝试计算绘图区域中的结果位置。问题是我无法参考绘图区域的坐标系。 我已尝试使用mapToScenemapToItemmapToParent以及反向mapFrom...对所有可以抓住的对象尝试执行此操作,但是没有用。

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

1 个答案:

答案 0 :(得分:7)

QChartView只是QGraphicsView,内嵌scene()。要获取任何图表中的坐标,您必须经历多个坐标转换:

  1. 从视图小部件坐标开始
  2. view->mapToScene:小部件(视图)坐标→场景坐标
  3. chart->mapFromScene:场景坐标→图表项坐标
  4. chart->mapToValue:图表项目坐标→给定系列中的值。
  5. 以给定系列中的值坐标结束。
  6. 术语“图表项目”和“图表窗口小部件”是同义词,因为QChart是一个QGraphicsWidget是一个QGraphicsItem。请注意,QGraphicsWidget a QWidget

    像这样实现它就像一个魅力(谢谢,马塞尔!):

    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;