返回

Qt QCustomPlot 实现点状网格线并拾取曲线坐标点

前端



**点阵的实现**

第一版本,使用 QCPItemLine 项

// 创建一个新的 QCPItemLine 对象
QCPItemLine *line = new QCPItemLine(plot);

// 设置线型、颜色和宽度
line->setPen(QPen(Qt::red, 2));

// 设置线的起点和终点
line->setLine(QPointF(0, 0), QPointF(100, 100));

// 将线添加到绘图中
plot->addItem(line);

第二版本,使用 QCPGraph

// 创建一个新的 QCPGraph 对象
QCPGraph *graph = new QCPGraph(plot);

// 设置线的颜色和宽度
graph->setPen(QPen(Qt::red, 2));

// 添加数据点
graph->addData(0, 0);
graph->addData(100, 100);

// 将线添加到绘图中
plot->addGraph(graph);

曲线坐标点拾取

// 启用鼠标追踪
plot->setMouseTracking(true);

// 连接鼠标移动事件的信号槽
connect(plot, SIGNAL(mouseMove(QMouseEvent *)), this, SLOT(onPlotMouseMove(QMouseEvent *)));

// 在鼠标移动时触发槽函数
void onPlotMouseMove(QMouseEvent *event)
{
    // 获取鼠标在绘图中的位置
    QPointF mousePos = plot->mapToView(event->pos());

    // 遍历曲线上的所有数据点
    for (int i = 0; i < graph->dataCount(); i++)
    {
        // 获取数据点的坐标
        QPointF dataPoint = graph->dataMainValue(i);

        // 计算鼠标位置和数据点之间的距离
        double distance = sqrt(pow(mousePos.x() - dataPoint.x(), 2) + pow(mousePos.y() - dataPoint.y(), 2));

        // 如果距离小于某个阈值,则认为鼠标悬停在数据点上
        if (distance < 10)
        {
            // 显示数据点的坐标
            qDebug() << "X: " << dataPoint.x() << ", Y: " << dataPoint.y();

            // 改变数据点的颜色,以示强调
            graph->setPen(QPen(Qt::green, 2));
        }
        else
        {
            // 重置数据点的颜色
            graph->setPen(QPen(Qt::red, 2));
        }
    }
}

通过以上代码,即可实现点状网格线和曲线坐标点拾取的功能,从而增强 Qt绘图的交互性和可视化效果。