qcustomplot游标测量功能--Apple的学习笔记

1.功能说明

上一个blog中(https://www.jianshu.com/p/5f48eaff0088)我已经实现了图像缩放,平移,自动大小及鼠标跟随来显示坐标。今天要实现2条测试线,吸附图像坐标,并且在右下角可以显示坐标差值的功能。

2.效果图

效果图.png

3.gif动图

游标测量.gif

4.关键代码

void MainWindow::mymouseMove(QMouseEvent *event)
{
    if(mydrag)
    {
        double x = ui->widget->xAxis->pixelToCoord(event->pos().x());
        double traceX=0;
        double traceY=0;
        mytrace->setGraph(ui->widget->graph(0));//设置游标吸附在traceGraph这条曲线上
        mytrace->setGraphKey(x);//设置游标的X值(这就是游标随动的关键代码)
        traceX = mytrace->position->key();
        traceY = mytrace->position->value();
        if(leftlineSelected)
        {
            // 将直线吸附到坐标点上
            left_line->point1->setCoords(traceX, 0);
            left_line->point2->setCoords(traceX, 1);
            left_line_posX = traceX;
            left_line_posY = traceY;
            distX = right_line_posX - left_line_posX;
            distY = right_line_posY - left_line_posY;
            label->setBrush(QBrush(QColor(199,99,188,80)));
            label->setText(tr("X:%1\nY:%2\ndelX:%3s\ndelY:%4M").arg(QString::number(traceX, 'f', 2)).arg(QString::number(traceY, 'f', 2))
                           .arg(QString::number(distX, 'f', 2)).arg(QString::number(distY, 'f', 2)));
            // 重绘
            ui->widget->replot();
        }
        else if(rightlineSelected)
        {
            // 将直线吸附到坐标点上
            right_line->point1->setCoords(traceX, 0);
            right_line->point2->setCoords(traceX, 1);
            right_line_posX = traceX;
            right_line_posY = traceY;
            distX = right_line_posX - left_line_posX;
            distY = right_line_posY - left_line_posY;
            label->setBrush(QBrush(QColor(199,99,23,80)));
            // 仅显示2位
            label->setText(tr("X:%1\nY:%2\ndelX:%3s\ndelY:%4M").arg(QString::number(traceX, 'f', 2)).arg(QString::number(traceY, 'f', 2))
                           .arg(QString::number(distX, 'f', 2)).arg(QString::number(distY, 'f', 2)));
            // 重绘
            ui->widget->replot();
        }
        else
        {

        }
    }

}

5.总结遇到的问题

  1. 如何判断正在拖动。后来网上查了思路通过press和relese来设置标志位,在move中判断标注位即可判断出当前属于鼠标拖动状态。
  2. 如何判断选择到了测量线。后来通过看官网的api及直接看源码,使用selectTest来判断当前鼠标按下的点,到测试对象的距离小于5则判断选中了此测量线。另外selectEvent和deselectEvent是虚方法,所以无法使用。

6.残留问题

第一次显示的delta不正确,原因是有一根线没有移动过。解决方法我也有了。初始化的时候2根线应该放到图像坐标的极限位置。另外一种解决方法是判断若为第一次拖动(及坐标变量未赋值时)则不显示delta差即可。
之后我还会做个完整版及多条图像同时处理的版本,到时候一起解决。先记录下。

你可能感兴趣的:(qcustomplot游标测量功能--Apple的学习笔记)