美文网首页C++Qt学习
qcustomplot游标测量功能--Apple的学习笔记

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

作者: applecai | 来源:发表于2019-11-24 15:49 被阅读0次

    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的学习笔记

        本文链接:https://www.haomeiwen.com/subject/aamlwctx.html