首页 文章

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

提问于
浏览
9

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

3 回答

  • 7

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

    然后使用轴' coordToPixel 转换(光标)像素坐标以绘制坐标并使用 QMap::lowerBound(cursorX) 搜索 QCPDataMap 中的最近点 .

  • 2

    您可以轻松地将插槽连接到 QCustomPlot 发出的 mouseMove 信号 . 然后,您可以使用 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));
    
    }
    
  • 9

    当您使用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;
            }
    }
    

相关问题