2013-04-02 200 views
0

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

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

回答

0

还有的是一些变化QWT 6比较5.

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

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

取决于我们的需求。

我们需要做的

接下来的事情是QwtPlotPicker与我们的定制插槽connect()信号selected(...)在这里我们可以得到x和y坐标或其他有趣的数据。

0

我在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小部件区域(如你所说)相关,而不仅仅是画布。