Qt QCustomPlot 添加多个坐标系区域

news2024/11/20 12:29:19
头图

Qt QCustomPlot 添加多个坐标系区域

文章目录

  • Qt QCustomPlot 添加多个坐标系区域
    • 摘要
    • 1 新建多个坐标系
      • QCPAxis
      • QCPAxisRect
      • QCPLayoutGrid
    • 2 多个坐标轴如何更新数据
      • 添加数据
    • 3 遇到的问题
    • 最后

关键字: DebianLinuxQCustomPlotQtQCPAxisRect

内容背景:

最近项目终于切到Linux下开发了,所以最近的记录都是发生在Debian 10 以及Arm Debain 10 下,Qt版本5.12.3。这几天真是问题多多,收获满满,不过目前阶段仅仅停留在解决问题,至于原理性的东西,还得慢慢消化。最近好多问题都是直接群里问大神,感谢各位大神助我成长。

摘要

之前在使用QCustomPlot,是将他有封装成了一个模块,一个模块仅显示一条曲线,多个通道的数据对应多个QCustomPlot模块,目前在使用中唯一遇到的问题就是在调用setOpenGL(true)的时候,会把多个QCustomPlot模块间的数据搞乱了,由于能力有限,在各种尝试后,任然没有解决问题,只能暂时先关闭OpenGL渲染,这样理论上会增加CPU的负载,但是目前也是没有更好的办法。

这次有新的机会尝试,为了某个里程碑事件,需要临时作出几个界面来,这样就有了新的机会来尝试在一个QCustomPlot模块中,加入多个坐标系统来实现一个QCustomPlot模块中,存在N和坐标系,本次我使用的是5个坐标系,如果需要多个,可以直接修改循环中N的大小即可。

1 新建多个坐标系

我这里整的不专业,就简单说一下吧,具体的大家可以百度一下,或者直接在CSDN站内搜索一下QCustomPlot,有很多专业系统的教程,可以参考,这里仅把我用到的点一下,因为我是真的不会,就是用到啥,现百度,完了简单消化一下。

QCPAxis

这个类就是坐标轴,需要依赖QCPAxisRect .至于这个太详细的,我也说不出个啥来,网上搬运两张图张图,把里面的关键内容展示一下,如下图

image-20221208164834478

image-20221208164920729

QCPAxisRect

矩形描述区域,依赖QCPCustomPlot其实我理解就是坐标系吧,虽然字面上是一个矩形区域。可以看下他的构造函数

QCPAxisRect (QCustomPlot *parentPlot, bool setupDefaultAxes=true);

第一个参数是父对象QCustomplot,第二个参数是否设置默认轴(四个轴,但是只显示左下)。构造函数告诉我们,QCPAxisRec必须依赖与一个父对象QCustomPlot

这个应该没有啥好说的,你要创建一个轴,当然得给个父类了,没毛病。

QCPLayoutGrid

网格布局,类似于Qt的QGridLayout这个也自行百度下相关知识点吧

直接上我的代码,核心是for循环里面的代码,其他的都是样式修复而已。

{
    QPen gridPen;                                                                                                                   /// 自定义一个画笔
    gridPen.setColor(QColor(188,188,188,188));                                                                                      /// 设置画笔颜色
    QVector<qreal> myDothline;                                                                                                      /// 定义一个容器,用来存放自定义曲线的内容数据
    qreal space = 10;                                                                                                               /// 定义曲线间隔
    myDothline << 0.2 << space;                                                                                                     /// 将自定义曲线数据装入数组
    gridPen.setDashPattern(myDothline);                                                                                             /// 将自定义的曲线装在到自定义的画笔中
    gridPen.setWidth(3);                                                                                                            /// 设置线宽
    gridPen.setCapStyle(Qt::RoundCap);
    gridPen.setJoinStyle(Qt::RoundJoin);

    for(auto i = 0;i<5;i++)
    {
        axislist[i] = new QCPAxisRect(ui->monitor,true);
        axislist[i]->axis(QCPAxis::atBottom)->setVisible(false);
        axislist[i]->axis(QCPAxis::atLeft)->setTicks(false);
        axislist[i]->axis(QCPAxis::atLeft)->setPadding(-35);
        axislist[i]->axis(QCPAxis::atLeft)->setBasePen(QPen(QColor(0,0,0,0)));
        axislist[i]->axis(QCPAxis::atLeft)->grid()->setPen(gridPen);
        axislist[i]->axis(QCPAxis::atLeft)->grid()->setZeroLinePen(gridPen);
        axislist[i]->axis(QCPAxis::atBottom)->setRange(0,100);
        axislist[i]->axis(QCPAxis::atLeft)->setRange(-100,100);
        graphlist[i] = ui->monitor->addGraph(axislist[i]->axis(QCPAxis::atBottom),axislist[i]->axis(QCPAxis::atLeft));
        graphlist[i]->setPen(QPen(QColor(qrand()%256,qrand()%256,qrand()%256),1));
        ui->monitor->plotLayout()->addElement(ui->monitor->axisRectCount(),0,axislist[i]);
    }
    ui->monitor->plotLayout()->simplify();                                                                                              /// 简化布局
    ui->monitor->replot(QCustomPlot::rpQueuedReplot);
}

2 多个坐标轴如何更新数据

这里就涉及到另一个知识点,QCPGraph了,这里需要需要看下他的构造函数。

QCPGraph(QCPAxis *keyAxis, QCPAxis *valueAxis);

这里可以看到,新建一个曲线,需要指定他的Key轴和value轴,所以,我们只需要在建立坐标系的时候,直接建立曲线,或者在建立需要建立曲线的时候,给定我们建好的坐标轴即可。这段代码也在上面的for循环中。如下

graphlist[i] = ui->monitor->addGraph(axislist[i]->axis(QCPAxis::atBottom),axislist[i]->axis(QCPAxis::atLeft));
graphlist[i]->setPen(QPen(QColor(qrand()%256,qrand()%256,qrand()%256),1));

核心代码就是第一句,第二句是我给了曲线一个伪随机颜色。

添加数据

{
    mRefreshTimer = new QTimer;
    mRefreshTimer->setTimerType(Qt::PreciseTimer);
    connect(mRefreshTimer,&QTimer::timeout,this,[=](){

    mMutex.lock();
    switch (dataChannelIndex) {
    case 1:
        axislist[channelIndex]->axis(QCPAxis::atBottom)->setRange(0,mUSB_ServiceThread->g_Key.count());
        axislist[channelIndex]->axis(QCPAxis::atLeft)->setRange(-100,100);
        graphlist[channelIndex]->setData(mUSB_ServiceThread->g_Key,mUSB_ServiceThread->g_Data_1);
        break;
    case 2:
        axislist[channelIndex]->axis(QCPAxis::atBottom)->setRange(0,mUSB_ServiceThread->g_Key.count());
        axislist[channelIndex]->axis(QCPAxis::atLeft)->setRange(-100,100);
        graphlist[channelIndex]->setData(mUSB_ServiceThread->g_Key,mUSB_ServiceThread->g_Data_2);
        break;
    default:
        axislist[channelIndex]->axis(QCPAxis::atBottom)->setRange(0,mUSB_ServiceThread->g_Key.count());
        axislist[channelIndex]->axis(QCPAxis::atLeft)->setRange(-100,100);
        graphlist[channelIndex]->setData(mUSB_ServiceThread->g_Key,mUSB_ServiceThread->g_Data_1);
        break;
    }

    mMutex.unlock();
    ui->monitor->replot(QCustomPlot::rpQueuedReplot);
    });
    mRefreshTimer->start(50);
}

我这里使用了一个定时器来定时刷新界面,里面根据通道索引,自动更新对应通道的数据即可。这样就可以实现我想要在一个QCustomPlot存在多个坐标系了。

3 遇到的问题

这里我因为只用了一个QCustomPlot,所以就像测试一下开启OpenGL模块的效果,但是呢,在虚拟机里面会报错一个错误,内如下,群里问各位大佬,说以需要把第一个问题解决了,但是我给定了目录后,还是会报第一个错误,而且会多出一个来,所以也不知道该怎么办了。这里有遇到或者可以解决的大佬,评论区搞起。

image-20221208162747322

幸运的是,这个在我的板子上跑起来,不会存在这个问题,测试没有问题,哈哈哈。

最后

扯了这么多,大家肯定要问我从哪里抄的,这里给出链接 QCustomplot(五)QCPAxisRect进行子绘图


博客签名2021

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3的中间值思维

在用vue框架的开发的时候&#xff0c;经常使用到的一种中间值思维&#xff0c;什么是中间值思维&#xff0c;就是通过一个间接的属性去改变需要渲染的值 我们在传值的时候&#xff0c;如果是用的mitt传值&#xff0c;那传过来的值就是在bus.on函数中&#xff0c;我们就得取出来…

消息中间件RocketMQ快速入门

目录前言消息中间件需要解决哪些问题&#xff1f;Publish/SubscribeMessage PriorityMessage FilterBroker端消息过滤Consumer端消息过滤Message Persistence消息可靠性低延迟消息回溯消费消息堆积定时消息消息重试RocketMQ 物理部署结构RocketMQ 逻辑部署结构RocketMQ 数据存储…

Scala 基础函数

1.前言 为什么要学习Scala 分布式高并发语言Go、R、Erlang等等为何选择Scala&#xff1f; Spark是大数据处理的核心方式&#xff0c;用scala语言编写&#xff01; Kafka分布式发布订阅消息系统&#xff0c;由LinkedIn捐给Apache&#xff0c;以极高的吞吐量著称&#xff0c;是…

人工智能-seaborn单双多变量绘图、两案例:NBA球员数据分析、北京租房数据统

1、 seaborn 作用&#xff1a;更高效地绘图 #安装 pip3 install seaborn#导入 import seaborn as sns单变量&#xff1a;直方图或核密度曲线 双变量&#xff1a;散点图、二维直方图、 主要函数&#xff1a;distplot()与joinplot()函数 1.1 单变量绘图 API import seabor…

cookie, session,redis全解析

cookie session redis 一. 前言 最近在学习node的过程中对于cookie&#xff0c;session&#xff0c;redis有了和之前不一样的理解&#xff0c;记录一下之前不了解的知识点。二.cookie的重点概念 存储在客户端浏览器中的字符串&#xff0c;最大5kb跨域不共享&#xff0c;每一个…

限定城市|临床医生自费赴日本大阪公立大学医学院访学观摩

X医生拟自费访学&#xff0c;目标是日本大阪都市圈&#xff0c;包括大阪、京都、奈良、神户等&#xff0c;优先考虑大阪市及京都市。最终我们申请到大阪公立大学医学院&#xff0c;对方在一周内连续发来两封邀请函&#xff0c;以便于X医生办理护照及单位的审批手续。对于首次办…

Zabbix与乐维监控对比分析(五)——可视化篇

前面我们详细介绍了Zabbix与乐维监控的架构与性能、Agent管理、自动发现、权限管理、对象管理、告警管理方面的对比分析&#xff0c;相信大家对二者的对比分析有了相对深入的了解&#xff0c;接下来我们将对二者的可视化功能进行对比分析。可视化是当代IT监控的一个创举&#x…

java+ssh+mysql客户关系管理系统

项目介绍&#xff1a; 本系统为基于jspsshmysql的客户关系管理系统&#xff0c;系统实现了权限自动化&#xff0c;可以自由创建角色&#xff0c;并为每个角色赋予权限&#xff0c;全部功能如下&#xff1a; 1.我的桌面&#xff1a;列出了一些办公常用快捷方式 2.信息中心&am…

CSDN第17次竞赛题解与总结

前言 临近期末考&#xff0c;博主时间较少&#xff0c;本文质量可能不高&#xff0c;请见谅。 2022/12/21 19:00~21:00 CSDN第17次竞赛开考 本场竞赛由「清华大学出版社 & CSDN」联合主办。 《算法竞赛》 本书解析了算法竞赛考核的数据结构、算法&#xff1b;组织了每个…

Python基础库及机器学习笔记

1.介绍 本节将主要介绍Python中的常用第三方库。这些库都是实现了各种计算功能的开源库&#xff0c;它们极大地丰富了Python的应用场景和计算能力&#xff0c;这里主要介绍NumPy、pandas和Matplotlib三个库的基础使用。其中NumPy是Python用来进行矩阵运算、高维度数组运算的数…

jQuery Ajax

文章目录jQuery Ajax概述load()简单使用加载部分内容传递数据回调函数$.get()$.post()$.getJSON()$.getScript()jQuery Ajax 概述 Ajax&#xff0c;全称“Asynchronous JavaScript and XML”&#xff0c;即“异步的JavaScript和XML”。其核心是通过JavaScript的XMLHttpReques…

分布式开源工作流引擎有什么特点?

在竞争越来越激烈的社会中&#xff0c;拥有提质增效的办公软件&#xff0c;可以为企业带来更可观的市场价值。分布式开源工作流引擎在企业数字化发展进程中深受欢迎&#xff0c;在帮助企业提升办公效率上发挥了重要的作用。今天&#xff0c;我们就一起里盘点下分布式开源工作流…

【轻松掌握C语言】程序环境和预处理

目录 一、程序的翻译和执行环境 1、翻译环境 2、执行环境 二、预处理详解 1、预定义符号 2、#define 3、#undef 4、命令行定义 5、条件编译 6、文件包含 一、程序的翻译和执行环境 1、翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 2、执行环境&#xff0…

笔记本怎么录制屏幕?只需2分钟,快速学会

如今&#xff0c;大多数人会在笔记本电脑上使用屏幕录制功能&#xff0c;如&#xff1a;在线直播课程、在线会议、电影和电视剧等场景。笔记本怎么录制屏幕&#xff1f;事实上&#xff0c;用电脑录制视频并不像你想象的那么困难。我们每天使用的电脑都有自己的屏幕录制功能&…

高性能数据分析时代,HPDA平台需要什么样的数据存储?

在海量基因数据中进行全基因数据分析&#xff0c;了解各种疾病与DNA之间的隐秘联系&#xff1b;对海洋气候进行预测&#xff0c;利用强大的数据分析性能&#xff0c;实现分钟级的数据刷新、精准预测海洋气候&#xff1b;利用高速相机模拟人脑上亿个神经元之间联接与工作&#x…

善康医药冲刺科创板上市:计划募资13亿元,上半年亏损5000万元

近日&#xff0c;深圳善康医药科技股份有限公司&#xff08;下称“善康医药”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。本次冲刺上市&#xff0c;善康医药计划募资13.27亿元&#xff0c;将用于新药研发项目、创新药高端制剂生产基地建设项目、营销…

redis学习第二天

Redis事务 Redis事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令插队。 Redis事务的主要作用就是串联多个命令防止别的命令插队。 Multi、Exec、discard 从输入Multi命令开始、…

【c++基础】第六章 STL标准模板库

第六章 STL标准模板库认识STLstring字符容器库vector容器迭代器与空间配置器deque容器容器适配置list容器set容器map容器观察者设计模型认识STL STL的概述 STL采用泛型思想&#xff0c;把C中所用到的所有的数据结构&#xff0c;按照一定的标准&#xff0c;全部封装成了一个个…

虚拟机docker网络问题处理

问题 我们有2台设备&#xff0c;ip 为 172.20.30.1 172.20.30.2 &#xff0c;虚拟机上的服务需要连接这2台设备&#xff0c;网络已经做通了&#xff0c;可以正常连接虚拟机异常关闭&#xff0c;重新开启后。发现服务有些问题&#xff0c;就打算将docker服务重新部署&#xff0…

Vue后台项目的记录 (一)

一、下载模板 简洁版: https://github.com/PanJiaChen/vue-admin-template 下载下来的文件介绍 build ----index.js webpack配置文件【很少修改这个文件】 mock ----mock数据的文件夹【模拟一些假的数据mockjs实现的】&#xff0c;因为咱们实际开发的时候&#xff0c;利用的是…