Display the plot values on mouse over. - Detect Scatter points
Asked Answered
S

3

11

I am attempting to display the plot values of different points on my QCustomPlot in which I have a Line style of lsLine. I know i could set a mouse over signal on the QCustomPlot but that wont really help since I just need to be informed when the mouse is over my plotted line.My question is is there any way to find out if the mouse is over my scatter point. Is there a signal i could connect to that would tell me when the mouse is over a scatter point ?

Suppressive answered 9/8, 2013 at 5:19 Comment(0)
D
11

Reimplement QCustomPlot::mouseMoveEvent or connect to QCustomPlot::mouseMove.

Then use axes' coordToPixel to translate (cursor) pixel coords to plot coords and search nearest points in your QCPDataMap with QMap::lowerBound(cursorX).

Donaugh answered 10/11, 2013 at 18:48 Comment(1)
@Suppressive coordToPixel translates plot coordinates to pixel coordinates. How did it solve your problem?Tenderize
T
10

You can easily just connect a slot to the mouseMove signal that QCustomPlot emits. You can then use QCPAxis::pixelToCoord to find the coordinate :

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));

}
Tenderize answered 14/5, 2014 at 12:48 Comment(3)
If I have two graphs on the ui, ui->widget_graph1 and ui->widget_graph2, how could I do it for both the graphs? Should I change the function name void CustomPlot::showPointToolTip(QMouseEvent *event){} to fit my case? I want both graphs to show coordinates on mouse hover, thanksTimorous
@Timorous If you implement the slot in QCustomPlot source code like i did, the tool-tip is shown for all of the plots. You can also have the slot in another class and use sender() to find out the plot that has emitted mouseMove signal.Tenderize
I only managed to find QCustomPlot::toolTip and I changed your void QCustomPlot::showPointToolTip(QMouseEvent *event){} into void QCustomPlot::toolTip(QMouseEvent *event){} Would it be the same?Timorous
L
2

when You use datetime format (including more point per second) of X axis, then pixel to coord fails. If you want to display coordinates between points, then this is the fastest way

maybe usefull (with connected signal 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;
        }
}
Langbehn answered 11/6, 2014 at 17:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.