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

相关内容

热门资讯

虎年经典对联 2022虎年经典对联(精选140句)  在平凡的学习、工作、生活中,大家总免不了要接触或使用对联吧,...
人生是什么仿写比喻句 人生是什么仿写比喻句(精选50句)  仿写是指仿照例句写句子,要求修改后的句意与原句意相符,且词性对...
描写星星的比喻句 描写星星的比喻句  对于星星,想必很多人都不陌生,亦有很多人喜欢看星星,下面是小编精心整理的描写星星...
初中生英语谚语 初中生英语谚语  在初中学习英语,我们会遇到很多英语谚语,那初中生需要掌握的英语谚语有哪些呢?接下来...
最新高考英语高频词汇 最新高考英语高频词汇  以下是由语文迷为大家整理的高考英语中经常出现的词汇,希望对你有帮助。  co...
长袖善舞属于褒义词还是贬义词 长袖善舞属于褒义词还是贬义词  长袖善舞原指有所依靠,事情就容易成功。后形容有财势会耍手腕的人,善于...
工作总结的格式与范文 工作总结的格式与范文  工作总结就是把一个时间段的工作进行一次全面系统的总检查、总评价、总分析、总研...
关于树叶像什么的比喻句 关于树叶像什么的比喻句  在日常生活或是工作学习中,大家都听说过或者使用过一些比较经典的句子吧,根据...
学习的谚语 学习的谚语  无论在学习、工作或是生活中,大家对谚语都不陌生吧,谚语是人民群众口头流传的习用的固定语...
象征、托物言志、托物寓意的区... 象征、托物言志、托物寓意的区别  象征、托物言志、托物寓意的区别你们知道吗?以下是小编给大家整理的象...
冬至的经典谚语 冬至的经典谚语  在学习、工作乃至生活中,大家都对那些朗朗上口的谚语很是熟悉吧,谚语是民间集体创造、...
中国古代四大才女(3)   尽管上官婉儿也曾一度享尽荣华与权力,但她仍要仰皇上、皇后、公主的鼻息,仍要曲意逢迎,这个中甘苦恐...
元旦节的对联 元旦节的对联大全  在平凡的学习、工作、生活中,大家一定都接触过一些使用较为普遍的对联吧,对联是中国...
翻花绳 翻花绳翻花绳1  人沈隽城,男,酷爱玩翻花绳。看到这里,你肯定要笑掉大牙,一个堂堂正正的男生,怎么会...
乔迁新居大门对联 乔迁新居大门对联大全  在不断进步的时代,大家都经常接触到对联吧,对联在自身发展过程中,又吸收了古体...
中国四大名著之一《三国演义》... 中国四大名著之一《三国演义》简介及角色介绍  《三国演义》描写了从东汉末年到西晋初年之间近105年的...
水滴石穿的歇后语   以下是小编给大家整理的水滴石穿的歇后语,欢迎大家阅读。
《杞人忧天》阅读附答案   下面是小编给大家整理的《杞人忧天》阅读附答案,欢迎大家查看。  杞国有人忧天地崩坠①,身亡所寄,...
三年级写人作文指导 三年级写人作文指导三年级写人作文指导仔细观察一个人,说说他(她)的身材,长相,穿什么样的衣服,给你怎...
小学写人作文指导 小学写人作文指导人物的思想品质和性格特征是通过一件具体的事例体现出来的,所以,写人一定要抓住最能反映...