Qt QCustomPlot 点状网格线实现和曲线坐标点拾取
创始人
2024-03-04 15:26:44
0
头图

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

文章目录

  • Qt QCustomPlot 点状网格线实现和曲线坐标点拾取
    • 摘要
    • 我想实现的效果
    • 点阵的实现
      • 第一版本,使用QPen Style
      • 第二版本,通过设置背景
      • 第三版本,回到QPen Style
    • 取曲线上的点

关键字: QCustomPlotgridQt拾取背景

摘要

今天被封控在家,但是万恶的资本家是不会让我在家摸鱼的,所以还是给了需求来,所以还是得搞。今天要接着研究QCustomPlot,老实说,这个也是我第一次用,也没有系统的研究过,只是用到了啥现研究,难免哪里问题或者不合理甚至是理解错误的地方。欢迎大家评论区交流。

我想实现的效果

有两个点,第一个是那个类似星星的背景点阵,我暂时先这么称呼它,因为我也不知道专业名称叫啥;第二个就是这个游标了,就是可以精确显示曲线上每个点的信息,其实就是坐标,如下图所示。这里应为我的需求只需要显示对应的值,所以我就吧X轴的数据隐藏掉了。

wwwwwwwwwww

点阵的实现

先来解决第一个点阵的问题,这个其实是最耗时的,因为网上没有现成的代码,没得抄(应该是叫莫得参考)。只能自己慢慢摸索。

第一版本,使用QPen Style

我发现 QCustomPlot 坐标轴和网格有一个接口就是设置QPen,所以打算通过设置坐标轴的网格的画笔来实现这个效果。在看帮助文档里面有一个样式是Qt::DotLine,如下图所示,是不是就可以实现点了。

image-20221130191734673

结果就是发现我还是太淡出了,如果真的可以这么简单,那就好了。

到时很简单,就是两行代码,如下

gCustomplot->yAxis->grid()->setPen(QPen(QColor(188,188,188,188),1,Qt::DotLine));                                                 
gCustomplot->yAxis->grid()->setZeroLinePen(QPen(QColor(188,188,188,188),1,Qt::DotLine));                                     

效果确实差强人意,如下图所示,这密密麻麻的虚线,咋也不想那种心电图上看到的样子,所以还是失败。

在这里插入图片描述

第二版本,通过设置背景

其实就是我发现在设置背景时候,可以通过画刷QBursh来实现背景填充,而我又碰巧发下QBrush中有一个Qt::Dense7Pattern填充很可能可以使用,如下图所示。所以,这个一度让我以为可以解决这个问题,甚至主动报告领导缩短了时间(这个时候其实脑子已经进水了)。

image-20221130192856073

要么说听话要听后半截呢,所以还是有看我后面的但是。但是呢,效果确实更为渣渣,如下图所示。

image-20221130192738222

其实看到这个效果的时候,我就觉得我今晚是要和我的小椅子摩擦摩擦一晚上了,真实麻烦他们给麻烦开门,麻烦到家了,为啥要和领导说可以今天搞定的,真实,阿西。

第三版本,回到QPen Style

就在我一筹莫展,瞎扒拉Qt 帮助文档的时候,发现了一个神奇的东西。Qt::CustomDashLine这个翻译一下不就是自定义虚线吗。哎嗨嗨,如果使用这个自定义虚线结合第一版的网格,是不是就可以试下了。

要么说这帮助文档还得属Qt 了,连怎么用都给你了,如下所示。

image-20221130193650869

大致就是先定义个容器,这个容器就是用来存放你自定义虚线的参数的,和面又定义了space的变量,这个看字面意思也就是间隔,空格的意思,那肯定就是空白部分了。再就是把你要显示的长度个间隔按照你的需求,存入到这个容器中。完了通过一个叫setDashPattern()接口放到你的画笔中,就可以绘制自己定义的曲线了。这人家都给说的这么明白了,咱要是再不试一试,那岂不是对不起这文档了。所以撸起代码了,先看下核心代码

 QPen gridPen;                                            /// 自定义一个画笔gridPen.setColor(QColor(188,188,188,188));            /// 设置画笔颜色QVector myDothline;                            /// 定义一个容器,用来存放自定义曲线的内容数据qreal space = 25;                                     /// 定义曲线间隔myDothline << 0.2 << space;                           /// 将自定义曲线数据装入数组gridPen.setDashPattern(myDothline);                   /// 将自定义的曲线装在到自定义的画笔中gridPen.setWidth(3);                                  /// 设置线宽gridPen.setCapStyle(Qt::RoundCap);gridPen.setJoinStyle(Qt::RoundJoin);gCustomplot->yAxis->setBasePen(QPen(QColor(0,0,0,0)));// 设置Y轴基础颜色gCustomplot->yAxis->setTickLabels(false);             // 设置不显示刻度值gCustomplot->yAxis->setSubTicks(false);               // 设置不显示子刻度线gCustomplot->yAxis->setTicks(false);                  // 设置不显示刻度线gCustomplot->yAxis->grid()->setPen(gridPen);          // 设置线样式gCustomplot->yAxis->grid()->setZeroLinePen(gridPen);  // 设置0刻线样式

效果就出来了,如下

wwwwwwwwwww

这里需要注意两个参数,就是线宽和这个自定义曲线的长度,即myDothline << 0.2 << space; 中的0.2gridPen.setWidth(3) 中的3这两需要大家不断修改和测试,我开始出来的都是横短线,慢慢修改这两个参数,最终出现了这种看着基本就是小圆点的效果。

所以到这里,基本就完成了我这个点阵背景的需求了。希望对小伙伴你也有一定帮助。

取曲线上的点

这个有的抄,基本调试一下就可以使用。这里就直接上代码(这个也是我抄来的,稍微加入了一点点自己的逻辑)

void XXXXXXXXXXXX::slot_showTracer(bool isShow)
{mflagIsShowTracer = isShow;if(mflagIsShowTracer){if(!tracer)tracer = new QCPItemTracer(gCustomplot);                                // 生成游标tracer->setPen(QPen(Qt::white));                                            // 圆圈轮廓颜色tracer->setBrush(QBrush(Qt::white));                                        // 圆圈圈内颜色tracer->setStyle(QCPItemTracer::tsCircle);                                  // 圆圈tracer->setSize(5);                                                         // 设置大小tracer->setVisible(false);                                                  // 需要线隐藏,不然不然会触发默认现实Bugif(!tracerLabel)tracerLabel = new QCPItemText(gCustomplot);                             // 生成游标说明tracerLabel->setText("");tracerLabel->setLayer("overlay");                                           // 设置图层为overlay,因为需要频繁刷新//        tracerLabel->setPen(QPen(Qt::green));                                     // 设置游标说明颜色tracerLabel->setColor(QColor(255,0,255));tracerLabel->setPositionAlignment(Qt::AlignLeft | Qt::AlignTop);            // 左上tracerLabel->position->setParentAnchor(tracer->position);                   // 将游标说明锚固在tracer位置处,实现自动跟随tracerLabel->setVisible(false);                                             // 需要线隐藏,不然不然会触发默认现实Bug}else{tracer->setVisible(false);tracerLabel->setVisible(false);}
}

鼠标移动槽函数,这里其实也可以不这么写,可以直接重写QCustomplot的鼠标移动函数。

void XXXXXXXXXXXX::slot_mouseMove(QMouseEvent *e)
{if(mflagIsShowTracer){tracer->setVisible(true);tracerLabel->setVisible(true);double x = gCustomplot->xAxis->pixelToCoord(e->pos().x());                      // 获得鼠标位置处对应的横坐标数据xtracer->setGraph(gCustomplot->graph(0));                                        // 将游标和该曲线图层想连接tracer->setGraphKey(x);                                                         // 将游标横坐标设置成刚获得的横坐标数据xtracer->setInterpolating(false);                                                // 游标的纵坐标可以通过曲线数据线性插值自动获得tracer->updatePosition();                                                       // 使得刚设置游标的横纵坐标位置生效//更新游标说明的内容//        double xValue = tracer->position->key();double yValue = tracer->position->value();tracerLabel->setText(QString("%1 μV").arg(yValue));gCustomplot->replot();                                                          // 重绘}}

这样写成槽函数的话,需要在代码中再关联一下槽函数,这样就实现了拾取点了。

connect(gCustomplot,&QCustomPlot::mouseMove,this,&Turing_Monitor_Kernel::slot_mouseMove);

博客签名2021

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...