QwtPlot鼠标点击事件

QwtPlot mouse click event

本文关键字:事件 鼠标 QwtPlot      更新时间:2023-10-16

我需要得到鼠标点击QwtPlot绘图区域(不是整个小部件!)的x和y坐标。问题是只有方法bool event(QEvent*)在每个事件上被调用。我找到了一些解决方案(http://www.qtcentre.org/archive/index.php/t-9502.html),使用QwtPlotPicker,但这对我不起作用,我使用Qwt 6,没有像setSelectionState()这样的方法。

在QwtPlot中实现绘图区域上的鼠标单击事件的其他方法是什么?

与Qwt 5相比,Qwt 6有一些变化。

现在我们需要使用QwtPlotPicker::setStateMachine(QwtPickerMachine)方法设置状态机。有几个选项(派生类):

  • QwtPickerClickPointMachine
  • QwtPickerClickRectMachine
  • QwtPickerDragPointMachine
  • QwtPickerDragRectMachine
  • QwtPickerPolygonMachine
  • QwtPickerTrackerMachine

取决于我们的需要。

接下来我们需要做的是connect()用我们的自定义槽从QwtPlotPicker信号selected(...),我们可以获得x和y坐标或其他有趣的数据。

我使用QwtPlotCanvas子类中的鼠标事件方法捕获鼠标事件,并使用QwtPlot中的转换方法将鼠标事件x和y坐标映射到它们在绘图中表示的值。

创建QwtPlotCanvas的子类,并像这样覆盖mousePressEvent方法。

void SpecialMapPlotCanvas::mousePressEvent (QMouseEvent* event) {
    QWidget::mousePressEvent (event);
    double x = plot() -> invTransform (plot() -> xBottom, event -> pos().x());
    double y = plot() -> invTransform (plot() -> yLeft, event -> pos().y());
    std::cout << "Values " << x << " " << y << "n";
}

然后通过实例化该类的对象并将其传递给QwtPlot::setCanvas来设置QwtPlot上的画布。然后SpecialMapPlotCanvas::plot()为您提供了对所属QwtPlot的引用,并且它的invTransform方法可用于将单击坐标转换为绘图值。如果在QwtPlot本身上使用鼠标事件,则会得到错误的答案,因为这里的鼠标事件坐标与整个QwtPlot小部件区域(如您所说)相关,而不仅仅是画布。