一个实时波形图的封装demo(QT)(qcustomplot)

news2024/11/16 9:53:43

前言:

        封装的一个实时波形图的类,可以直接提升使用。 提供了接口,可以更改颜色,样式,等等

参考:

Qt Plotting Widget QCustomPlot - Introduction

另外参考了一个大神的作品,链接没找到。

项目文件:

123盘  

123盘  实时波形图官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘

CSDN

【免费】一个实时波形图的封装demo(QT)(qcustomplot)资源-CSDN文库

源码

WaveChart文件夹:

1.加入文件qcustomplot.h 和 qcustomplot.cpp:

2.WaveChart.pri文件:

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport

FORMS += \
    $$PWD/waveWidget.ui

HEADERS += \
    $$PWD/qcustomplot.h \
    $$PWD/waveWidget.h

SOURCES += \
    $$PWD/qcustomplot.cpp \
    $$PWD/waveWidget.cpp

3.waveWidget.h文件:

#ifndef WAVEWIDGET_H
#define WAVEWIDGET_H

#include <QWidget>
#include <QVBoxLayout>
#include <vector>
#include <cstring>
#include <numeric>
//#include <QScrollBar>
#include "qcustomplot.h"
using std::vector;
namespace Ui {
class WaveWidget;
}

class WaveWidget : public QWidget
{
    Q_OBJECT

public:
    explicit WaveWidget(QWidget *parent = nullptr);
    ~WaveWidget();

    void init(bool isShowTicks=true, bool isShowTickLables=true, bool isShowGrid=true, bool isShowSubGrid=true, bool isShowAxis2=true, bool isGraphBigAndSmall=true);
    void setTheme(QColor axis, QColor background);
    void setXAxisLable(const char* name, const char* name2 = "");
    void setYAxisLable(const char* name, const char* name2 = "");
    void setPen(Qt::GlobalColor penColor, QCPGraph::LineStyle lineStyle = QCPGraph::lsLine, QColor brushColor = QColor(255,255, 255, 100), bool isShow = true);
    void addNewData(double data);
    void setTitle(const char* name);

    double getMax();
    double getMin();
    double getAverage();

    QCustomPlot*    getTheChartPlot();
    QCPGraph*       getTheGraph();
    vector<double>  &getTheVector();

private:
    Ui::WaveWidget *ui;

    QCustomPlot*    chartPlot = new QCustomPlot(this);      // 图表
    QCPGraph*       graph;                                  // 曲线
    //QScrollBar      horizontalScrollBar;

    vector<double>  graphData;                              // 图表数据,只作记录使用
    int             timeRange = 10;                         // 时间轴范围
    QTime time;
    double          sum = 0.0;

};

#endif // WAVEWIDGET_H

4.waveWidget.cpp文件

#include "waveWidget.h"
#include "ui_waveWidget.h"

WaveWidget::WaveWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::WaveWidget)
{
    ui->setupUi(this);

    // 初始化图表
    graph = chartPlot->addGraph();
    // graph->addData(1,1);
    // graph->addData(2,3);

    // 初始化设置
    // chartPlot->xAxis->setRange(1, 4096);
    // chartPlot->yAxis->setRange(-1, 350); // 假设灰度值的范围为0-255
    // chartPlot->xAxis->setLabel("Pixel");
    // chartPlot->yAxis->setLabel("Gray Value");

    QVBoxLayout* layout = new QVBoxLayout;
    layout->addWidget(ui->title);
    layout->addWidget(chartPlot);
    chartPlot->setSizePolicy(QSizePolicy::Policy(QSizePolicy::Preferred), QSizePolicy::Policy(QSizePolicy::Expanding));
    //layout->addWidget((QWidget)horizontalScrollBar);
    setLayout(layout);

    // init();


}

WaveWidget::~WaveWidget()
{
    delete ui;
}

void WaveWidget::init(bool isShowTicks, bool isShowTickLables, bool isShowGrid, bool isShowSubGrid, bool isShowAxis2, bool isGraphBigAndSmall)
{
    time = QTime::currentTime();
    // 刻度显示
    chartPlot->xAxis->setTicks(isShowTicks);
    chartPlot->yAxis->setTicks(isShowTicks);
    // 刻度值显示
    chartPlot->xAxis->setTickLabels(isShowTickLables);
    chartPlot->yAxis->setTickLabels(isShowTickLables);
    // 网格显示
    chartPlot->xAxis->grid()->setVisible(isShowGrid);
    chartPlot->yAxis->grid()->setVisible(isShowGrid);
    // 子网格显示
    chartPlot->xAxis->grid()->setSubGridVisible(isShowSubGrid);
    chartPlot->yAxis->grid()->setSubGridVisible(isShowSubGrid);
    // 右和上坐标轴、刻度值显示
    chartPlot->xAxis2->setVisible(isShowAxis2);
    chartPlot->yAxis2->setVisible(isShowAxis2);
    chartPlot->yAxis2->setTicks(isShowAxis2);
    chartPlot->yAxis2->setTickLabels(isShowAxis2);
    // make top right axes clones of bottom left axes. Looks prettier:
//    chartPlot->axisRect()->setupFullAxesBox();
    // make left and bottom axes always transfer their ranges to right and top axes:
    if(isShowAxis2){
        connect(chartPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), chartPlot->xAxis2, SLOT(setRange(QCPRange)));
        connect(chartPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), chartPlot->yAxis2, SLOT(setRange(QCPRange)));
    }

    // 暗色主题
    //setPlotTheme(Qt::white, Qt::black);
    // 亮色主题
    setTheme(Qt::black, Qt::white);
    if(isGraphBigAndSmall){
        // 可放大缩小和移动
        chartPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
    }

    // x轴以时间形式显示
    QSharedPointer<QCPAxisTickerTime> timeTicker(new QCPAxisTickerTime);
    timeTicker->setTimeFormat("%h:%m:%s");
    chartPlot->xAxis->setTicker(timeTicker);
    chartPlot->axisRect()->setupFullAxesBox();
    chartPlot->replot();
}

void WaveWidget::setTheme(QColor axis, QColor background)
{
//----------------------------------------------------------------------------------------//
    // 坐标标注颜色
    chartPlot->xAxis->setLabelColor(axis);
    chartPlot->yAxis->setLabelColor(axis);
    // 坐标刻度值颜色
    chartPlot->xAxis->setTickLabelColor(axis);
    chartPlot->yAxis->setTickLabelColor(axis);
    // 坐标基线颜色和宽度
    chartPlot->xAxis->setBasePen(QPen(axis, 1));
    chartPlot->yAxis->setBasePen(QPen(axis, 1));
    // 坐标主刻度颜色和宽度
    chartPlot->xAxis->setTickPen(QPen(axis, 1));
    chartPlot->yAxis->setTickPen(QPen(axis, 1));
    // 坐标子刻度颜色和宽度
    chartPlot->xAxis->setSubTickPen(QPen(axis, 1));
    chartPlot->yAxis->setSubTickPen(QPen(axis, 1));
    // 坐标标注颜色
    chartPlot->xAxis2->setLabelColor(axis);
    chartPlot->yAxis2->setLabelColor(axis);
    // 坐标刻度值颜色
    chartPlot->xAxis2->setTickLabelColor(axis);
    chartPlot->yAxis2->setTickLabelColor(axis);
    // 坐标基线颜色和宽度
    chartPlot->xAxis2->setBasePen(QPen(axis, 1));
    chartPlot->yAxis2->setBasePen(QPen(axis, 1));
    // 坐标主刻度颜色和宽度
    chartPlot->xAxis2->setTickPen(QPen(axis, 1));
    chartPlot->yAxis2->setTickPen(QPen(axis, 1));
    // 坐标子刻度颜色和宽度
    chartPlot->xAxis2->setSubTickPen(QPen(axis, 1));
    chartPlot->yAxis2->setSubTickPen(QPen(axis, 1));
    // 整个画布背景色
    chartPlot->setBackground(background);
    // 绘图区域背景色
    chartPlot->axisRect()->setBackground(background);
    // 刷新绘图
    chartPlot->replot();
}

void WaveWidget::setXAxisLable(const char *name, const char* name2)
{
    chartPlot->xAxis->setLabel(name);
    if(strlen(name2)!=0)
        chartPlot->xAxis2->setLabel(name2);

    chartPlot->replot();
}

void WaveWidget::setYAxisLable(const char *name, const char* name2)
{
    chartPlot->yAxis->setLabel(name);
    if(strlen(name2)!=0)
        chartPlot->yAxis2->setLabel(name2);

    chartPlot->replot();
}

void WaveWidget::setPen(Qt::GlobalColor penColor, QCPGraph::LineStyle lineStyle, QColor brushColor, bool isShow)
{
    graph->setPen(QPen(penColor)); // 设置线条颜色为蓝色
    graph->setLineStyle(lineStyle); // 设置线型为直线
    graph->setVisible(isShow);

    chartPlot->graph()->setBrush(QBrush(brushColor));

    chartPlot->replot();
}

void WaveWidget::addNewData(double data)
{
    // 系统当前时间 = 系统运行初始时间 + 系统运行时间
    static double start = time.hour()*60*60 + time.minute()*60 + time.second() + time.msec()/1000.0;
    double key = start + time.elapsed()/1000.0;

    // 设置时间轴
    chartPlot->xAxis->setRange(key, timeRange, Qt::AlignRight);
    //chartPlot->rescaleAxes();
    // 刷新绘图水平滚动条
    //horizontalScrollBar.setRange(int(start), int(key));  // 刷新滚动条的范围
    //horizontalScrollBar.setPageStep(1);                  // 设置翻页步长为 1s 的宽度
    //horizontalScrollBar.setValue(int(key));              // 调整滑块位置到最右边
    // 更新曲线绘图
    chartPlot->graph()->addData(key, data);
    chartPlot->replot(QCustomPlot::rpQueuedReplot);

    // 存储曲线的当前值
    graphData.push_back(data);
    sum += data;
}

void WaveWidget::setTitle(const char *name)
{
    ui->title->setText(name);
}

double WaveWidget::getMax()
{
    return *std::max_element(graphData.begin(),graphData.end());
}

double WaveWidget::getMin()
{
    return *std::min_element(graphData.begin(),graphData.end());
}

double WaveWidget::getAverage()
{
    return 1.0*sum/(graphData.size());
}

QCustomPlot *WaveWidget::getTheChartPlot()
{
    return   chartPlot;
}

QCPGraph *WaveWidget::getTheGraph()
{
    return  graph;
}

vector<double> &WaveWidget::getTheVector()
{
    return graphData;
}

5.测试demo:

新建测试界面:

提升为刚刚的类:

效果:

测试:

    ui->setupUi(this);

    // 初始化:可以设置参数
    ui->waveWidget->init();

    // 可选设置:
    ui->waveWidget->setXAxisLable("Time");
    ui->waveWidget->setYAxisLable("Value");
    ui->waveWidget->setPen(Qt::blue, QCPGraph::lsLine, QColor( 36,141,218,255));
    ui->waveWidget->setTheme(Qt::red, Qt::white);
    ui->waveWidget->setTitle("Wave Chart Test");

    // 测试加入数据:
    QTimer *timer = new QTimer(this);
    connect(timer,&QTimer::timeout,[=](){
        ui->waveWidget->addNewData((qrand()%1000)/1000.0);
        qDebug()<<"max:"<<ui->waveWidget->getMax()<<"   min:"<<ui->waveWidget->getMin()<<"  average:"<<ui->waveWidget->getAverage();
        if(num%10==0){
            qDebug()<<"size: "<<ui->waveWidget->getTheVector().size();
            ui->waveWidget->getTheVector().clear();
            qDebug()<<"size: "<<ui->waveWidget->getTheVector().size()<<"********";
        }
        if(num>50){
            timer->stop();
        }
        num++;
    });
    timer->start(100);

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

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

相关文章

15.prometheus.yml的rule_files配置

平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我。 跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~ 1.rule_files配置 1.1.rule_files配置解读…

【北京迅为】《iTOP-3588开发板网络环境配置手册》第2章 电脑、开发板直连交换机或路由器

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

BeautifulSoup+xpath+re+css简单复习+新的scrapy的学习

1.BeautifulSoupsoup BeautifulSoup(html,html.parser)all_icosoup.find(class_"DivTable") 2.xpath trs resp.xpath("//tbody[idcpdata]/tr") hong tr.xpath("./td[classchartball01 or classchartball20]/text()").extract() 这个意思是找…

【竞技宝】DOTA2-梦幻联赛S22:AR命悬一线 XG确定晋级淘汰赛

北京时间2024年2月28日&#xff0c;DOTA2梦幻联赛S22的比赛在昨日进入小组赛第三个比赛日&#xff0c;本次梦幻联赛共有AR、XG、IG三支中国区的队伍参赛&#xff0c;那么经过三日激烈的比赛之后&#xff0c;目前三支队伍的积分情况以及晋级形势如何呢&#xff1f; XG XG是小组…

手机使用Python轻松下载闲鱼短视频

目录 一、Python与手机端的结合 二、闲鱼短视频下载原理 三、使用Python实现下载 安装必要的库 捕获视频流 保存视频文件 四、案例分析 五、注意事项 六、总结 在数字化时代&#xff0c;短视频已成为人们获取信息、娱乐休闲的重要方式之一。闲鱼&#xff0c;作为国内知…

(PWM呼吸灯)合泰开发板HT66F2390-----点灯大师

前言 上一篇文章相信大家已经成为了点灯高手了&#xff0c;那么进阶就是成为点灯大师 实现PWM呼吸灯 接下来就是直接的代码讲解了&#xff0c;不再讲PWM原理的 这里部分内容参考了另一个博主的文章 合泰杯——合泰单片机工程7之PWM输出 如果有小伙伴不理解引脚设置和delay函数…

docker (十二)-私有仓库

docker registry 我们可以使用docker push将自己的image推送到docker hub中进行共享&#xff0c;但是在实际工作中&#xff0c;很多公司的代码不能上传到公开的仓库中&#xff0c;因此我们可以创建自己的镜像仓库。 docker 官网提供了一个docker registry的私有仓库项目&#…

【Micropython教程】点亮第一个LED与流水灯

文章目录 前言MicroPython在线仿真GPIO的工作模式一、有哪些工作模式&#xff1f;1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 一、machine.Pin类1.1 machine.Pin 类的构造对象1.2 machine.Pin 类的方法init方法value方法设置高低电平方法 二、延时函数 三、流水灯总…

6U VPX全国产飞腾D2000/8核+复旦微FPGA信息处理主板

产品特性 产品功能 飞腾计算平台&#xff0c;国产化率100% VPX-MPU6503是一款基于飞腾D2000/8核信息处理主板&#xff0c;采用由飞腾D2000处理器飞腾X100桥片的高性能计算机模块&#xff0c;双通道16G贴装内存&#xff0c;板载128G 固态SSD&#xff1b;预留固态盘扩展接口&…

通过XML调用CAPL脚本进行测试(新手向)

目录 0 引言 1 XML简介 2 通过XML调用CAPL脚本 0 引言 纪念一下今天这个特殊日子&#xff0c;四年出现一次的29号。 在CANoe中做自动化测试常用的编程方法有CAPL和XML两种&#xff0c;二者各有各的特色&#xff0c;对于CAPL来说新手肯定是更熟悉一些&#xff0c;因为说到在C…

循环结构:for循环,while循环,do-while,死循环

文章目录 for循环for案例&#xff1a;累加for循环在开发中的常见应用场景 whilewhile循环案例&#xff1a; for和while的区别&#xff1a;do-while三种循环的区别小结死循环 快捷键 ctrlaltt for循环 看循环执行多少次&#xff0c;就看有效数字有几个 快捷键 fori 示例代码&am…

测评ONLYOFFICE 8.0版本:办公利器再升级

测评ONLYOFFICE 8.0版本&#xff1a;办公利器再升级 前言注册使用升级功能速览全新外观设计wordexcelPPTPDF 协作功能强化更强大的功能复杂表单的填写 移动端优化结语 前言 随着科技的不断发展&#xff0c;办公软件在提升用户体验和工作效率方面扮演着越来越重要的角色。作为一…

Apache的安装与配置(使用)

目录 前言 一&#xff0c;安装 1. centos上安装Apache 1.1 基本使用 启动 停止 检查 测试运行 设置开机启动 2. 部署web 下载 解压 安装mysql数据库 安装php7.3 3.安装wordpress httpd命令语法解释 httpd几个常用目录 httpd常用的协议状态码解释 前言 apache…

基于stm32F103的座面声控台灯

1.基本内容&#xff1a; 设计一个放置在桌面使用的台灯&#xff0c;使用220v交流电供电。具备显示屏能够实时显示日期&#xff08;年、月、日和星期&#xff09;&#xff0c;时间&#xff08;小时、分钟、秒&#xff09;和温度&#xff08;摄氏度&#xff09;&#xff1b;能够通…

3D数字孪生

数字孪生&#xff08;Digital Twin&#xff09;是物理对象、流程或系统的虚拟复制品&#xff0c;用于监控、分析和优化现实世界的对应物。 这些数字孪生在制造、工程和城市规划等领域变得越来越重要&#xff0c;因为它们使我们能够在现实世界中实施改变之前模拟和测试不同的场景…

vmware安装centos 7.9 操作系统

vmware安装centos 7.6 操作系统 1、下载centos 7.9 操作系统镜像文件2、安装centos 7.9 操作系统3、配置centos 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载centos 7.9 操作系统镜像文件 本文选择centos 7.9 最小化安装镜像包 这里选…

云尚办公-0.0.3

5. controller层 import pers.beiluo.yunshangoffice.model.system.SysRole; import pers.beiluo.yunshangoffice.service.SysRoleService;import java.util.List;//RestController&#xff1a;1.该类是控制器&#xff1b;2.方法返回值会被写进响应报文的报文体&#xff0c;而…

express+mysql+vue,从零搭建一个商城管理系统3--user路由模块

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建routes文件夹二、新建routes/index.js和routes/user.js三、修改index.js四、修改routes/index.js五、修改routes/user.js六、启动项目预览总结 前言 需求&#xff1a;主要学习express&#xff0c;所…

Adobe Acrobat DC中如何合并pdf并生成目录

一、利用 Acrobat 合成pdf目录 &#xff08;一&#xff09;新建标签&#xff08;更改标签等级等&#xff09; 1&#xff0c;用Adobe acrobat 软件打开待添加书签的pdf文档。 2&#xff0c;打开之后点击软件左边栏的书签&#xff08;有时被隐藏了&#xff0c;点击一下界面左边…

电脑周末设置节日提醒倒计时方法教程

每当节日临近&#xff0c;无论是传统的元宵节、端午节&#xff0c;还是其他各种特殊的日子&#xff0c;我总期待着能与家人团聚&#xff0c;或是为自己准备一份小惊喜&#xff0c;享受那份独特的仪式感。 但生活的忙碌和琐碎的事情常常让我忘记这些重要的日子。有时&#xff0…