Отображение значений графика при наведении мыши. - Обнаружение точек разброса

Я пытаюсь отобразить значения графика разных точек на моем QCustomPlot, в котором у меня есть стиль линии lsLine. Я знаю, что могу установить мышь над сигналом на QCustomPlot но это действительно не поможет, так как мне просто нужно сообщить, когда мышь находится над моей строкой.Мой вопрос в том, есть ли способ узнать, находится ли мышь над моей точкой разброса. Есть ли сигнал, к которому я могу подключиться, который скажет мне, когда мышь находится над точкой разброса ?

3 ответов


Reimplement QCustomPlot::mouseMoveEvent или подключиться к QCustomPlot::mouseMove.

тогда используйте axes'coordToPixel перевести (курсор) пиксельные координаты для построения координат и поиска ближайших точек в вашем QCPDataMap С QMap::lowerBound(cursorX).


вы можете легко просто подключить слот к 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));

}

при использовании формата datetime (включая больше точек в секунду) оси X происходит сбой пикселя в coord. Если вы хотите отобразить координаты между точками, то это самый быстрый способ

может быть полезно (с подключенным сигнала 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;
        }
}