在鼠标悬停时显示绘图值。 - 检测散点

时间:2013-08-09 05:19:58

标签: c++ qt mouseover point qcustomplot

我试图在QCustomPlot上显示不同点的绘图值,其中我的线型为lsLine。我知道我可以在QCustomPlot上设置一个鼠标悬停信号,但这不会真正有用,因为当鼠标悬停在我的绘制线上时我只需要通知。我的问题是有没有办法找出鼠标是否超过了我的分散点。是否有可以连接的信号,当鼠标在散点上时会告诉我?

3 个答案:

答案 0 :(得分:9)

重新实现QCustomPlot::mouseMoveEvent或连接到QCustomPlot::mouseMove

然后使用轴'coordToPixel翻译(光标)像素坐标以绘制坐标并使用QCPDataMapQMap::lowerBound(cursorX)中搜索最近的点。

答案 1 :(得分:8)

您可以轻松地将插槽连接到mouseMove发出的QCustomPlot信号。然后,您可以使用QCPAxis::pixelToCoord查找坐标:

connect(this, SIGNAL(mouseMove(QMouseEvent*)), this,SLOT(showPointToolTip(QMouseEvent*)));

void QCustomPlot::showPointToolTip(QMouseEvent *event)
{

    int x = this->xAxis->pixelToCoord(event->pos().x());
    int y = this->yAxis->pixelToCoord(event->pos().y());

    setToolTip(QString("%1 , %2").arg(x).arg(y));

}

答案 2 :(得分:2)

当您使用X轴的日期时间格式(包括每秒更多点数)时,像素到坐标将失败。 如果要显示点之间的坐标,那么这是最快的方法

可能有用(连接信号QCustomplot::MouseMove

void MainWindow::onMouseMoveGraph(QMouseEvent* evt)
    {
    int x = this->ui->customPlot->xAxis->pixelToCoord(evt->pos().x());
    int y = this->ui->customPlot->yAxis->pixelToCoord(evt->pos().y());
    qDebug()<<"pixelToCoord: "<<data.key<<data.value; //this is correct when step is greater 1 second

if (this->ui->customPlot->selectedGraphs().count()>0)
        {
        QCPGraph* graph = this->ui->customPlot->selectedGraphs().first();
        QCPData data = graph->data()->lowerBound(x).value();

        double dbottom = graph->valueAxis()->range().lower;        //Yaxis bottom value
        double dtop = graph->valueAxis()->range().upper;           //Yaxis top value
        long ptop = graph->valueAxis()->axisRect()->top();         //graph top margin
        long pbottom = graph->valueAxis()->axisRect()->bottom();   //graph bottom position
// result for Y axis
        double valueY = (evt->pos().y() - ptop) / (double)(pbottom - ptop)*(double)(dbottom - dtop) + dtop;

//or shortly for X-axis
        double valueX = (evt->pos().x() - graph->keyAxis()->axisRect()->left());  //graph width in pixels
        double ratio = (double)(graph->keyAxis()->axisRect()->right() - graph->keyAxis()->axisRect()->left()) / (double)(graph->keyAxis()->range().lower - graph->keyAxis()->range().upper);    //ratio px->graph width
//and result for X-axis
        valueX=-valueX / ratio + graph->keyAxis()->range().lower;


        qDebug()<<"calculated:"<<valueX<<valueY;
        }
}
相关问题