首页 > 其他分享 >[QT QCustomPlot]实时折线图(坐标轴可缩放)

[QT QCustomPlot]实时折线图(坐标轴可缩放)

时间:2024-11-05 08:48:18浏览次数:5  
标签:Qt customPlot yAxis 缩放 QCustomPlot 图表 xAxis QT

[QT QCustomPlot]实时折线图(坐标轴可缩放)

1.QCustomPlot介绍

QCustomPlot 是一个用于 Qt 框架的高性能、可扩展的图表库,专门设计用于显示和交互复杂的绘图。它提供了一个非常灵活的接口,允许开发者在 Qt 应用程序中轻松地实现各种图表和图形。以下是 QCustomPlot 的一些关键特性和用途:

  1. 图表类型:QCustomPlot 支持多种图表类型,包括折线图、散点图、柱状图、饼图、面积图等。

  2. 实时更新:QCustomPlot 特别适合于需要实时更新数据的场景,例如股票价格监控、传感器数据可视化等。

  3. 交互性:用户可以与图表进行交互,例如缩放、平移、点击图表元素等。

  4. 自定义:QCustomPlot 提供了高度的自定义能力,包括轴、图例、工具提示等,以及图表的样式和颜色。

  5. 性能:由于其优化的绘图算法,QCustomPlot 能够处理大量的数据点而不会显著降低性能。

  6. 事件处理:QCustomPlot 支持事件处理,例如点击、悬停等,这使得开发者可以为图表元素添加自定义的行为。

  7. 导出功能:QCustomPlot 允许将图表导出为图像文件,如 PNG 或 SVG 格式。

  8. 集成:QCustomPlot 可以轻松集成到任何基于 Qt 的应用程序中,无论是桌面应用还是移动应用。

  9. 文档和示例:QCustomPlot 提供了详细的文档和示例代码,帮助开发者快速上手。

  10. 开源:QCustomPlot 是开源的,可以在遵守其许可证的条件下免费使用和修改。

在实际应用中,QCustomPlot 可以用于科学计算、数据分析、商业报告、实时监控系统等多种场合,它的灵活性和性能使其成为 Qt 开发者在需要图表功能时的一个受欢迎的选择。

2.QCustomPlot下载

官网:https://www.qcustomplot.com/
下载
在这里插入图片描述
下载解压,解压后文件:
在这里插入图片描述
其中qcustomplot.cpp及qcustomplot.h是移植需要用到的文件

3.移植

我这里以qt5.12.5举例,其他版本操作一致;

①新建Mainwindow项目

在这里插入图片描述

②添加相关文件

将qcustomplot.cpp及qcustomplot.h添加进工程路径
在这里插入图片描述
在xxxx.pro文件中添加如下内容:
在这里插入图片描述
添加完成后可以先构建一下看看有没有报错;
在这里插入图片描述

③ui文件添加qcustomplot控件

qcustomplot控件是基于qwidget控件的;我们先拖一个qwidget控件进来,并调整合适大小;
在这里插入图片描述
鼠标右键刚拖进来的qwidget,选择“提升为…”
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这样,qwidget类就会被提升为qcustomplot类;
将objectName改为:customPlot
在这里插入图片描述

4.用户程序

①mainwindow.h

#include <QTimer>			//设置定时器
#include <QDateTime>		//获取时间

在这里插入图片描述

②mainwindow.cpp

新建两个变量用于图表数据显示:

float Speed_CatTom;
float Speed_MouseJerry;

编写QCustomPlot图表初始化代码:

/**
 * @brief  QCustomPlot控件初始化
 * @param  void
 * @return void
 */
void MainWindow::QCustomPlotInit()
{
    QCustomPlot* customPlot = ui->customPlot;

    /* 性能优化? */
    ui->customPlot->replot();

    //曲线1
    customPlot->addGraph();
    QPen tar;
    tar.setColor(QColor(40, 110, 255));       //曲线1蓝色
    tar.setStyle(Qt::PenStyle::DashLine);     //虚线
    tar.setWidth(3);                          //线宽
    customPlot->graph(0)->setPen(tar);
    //曲线2
    customPlot->addGraph();
    QPen rec;
    rec.setColor(QColor(255, 110, 40));       //曲线1蓝色
    rec.setWidth(3);                          //线宽
    customPlot->graph(1)->setPen(rec);
    //customPlot->graph(1)->setPen(QPen(QColor(255, 110, 40)));//曲线2红色
    //设置标题
    //    customPlot->plotLayout()->insertRow(0);
    //    customPlot->plotLayout()->addElement(0, 0, new QCPTextElement(customPlot, "目标与实时转速", QFont("sans", 12, QFont::Bold)));

    //    //设置渐变颜色:0-1之间;
    //    QLinearGradient gradient(0, 0, 0, 400);
    //    gradient.setColorAt(0, QColor(90, 90, 90));
    //    gradient.setColorAt(0.38, QColor(105, 105, 105));
    //    gradient.setColorAt(1, QColor(70, 70, 70));
    //    customPlot->setBackground(QBrush(gradient));
    //坐标轴使用时间刻度
    QSharedPointer<QCPAxisTickerTime> timeTicker(new QCPAxisTickerTime);
    timeTicker->setTimeFormat("%h:%m:%s");
    customPlot->xAxis->setTicker(timeTicker);
    //四边安上坐标轴
    customPlot->axisRect()->setupFullAxesBox();
    //设置y轴范围
    customPlot->yAxis->setRange(0 ,3500);
    //设置x、y轴标签
    customPlot->xAxis->setLabel("时间");
    customPlot->yAxis->setLabel("奔跑速度");

    //设置x、y轴标签颜色
    //    customPlot->xAxis->setBasePen(QPen(Qt::white));
    //    customPlot->xAxis->setTickPen(QPen(Qt::white));
    //    customPlot->xAxis->setSubTickPen(QPen(Qt::white));
    //    customPlot->xAxis->setTickLabelColor(Qt::white);
    //    customPlot->xAxis->setLabelColor(Qt::white);
    //    customPlot->yAxis->setBasePen(QPen(Qt::white));
    //    customPlot->yAxis->setTickPen(QPen(Qt::white));
    //    customPlot->yAxis->setSubTickPen(QPen(Qt::white));
    //    customPlot->yAxis->setTickLabelColor(Qt::white);
    //    customPlot->yAxis->setLabelColor(Qt::white);

    //设置图例边框
    customPlot->legend->setBorderPen(Qt::NoPen);
    //图例字体及大小
    QFont legendFont = font();
    legendFont.setPointSize(10);
    customPlot->legend->setFont(legendFont);
    //显示图例
    customPlot->legend->setVisible(true);
    //设置图例背景色
    customPlot->legend->setBrush(QColor(255, 255, 255, 100));
    customPlot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignLeft|Qt::AlignTop); // make legend align in top left corner or axis rect
    //图例说明-与上述添加曲线颜色对应
    customPlot->graph(0)->setName("Tom速度");
    customPlot->graph(1)->setName("Jerry速度");

    // 设置 y轴为线性刻度
    customPlot->yAxis->setScaleType(QCPAxis::stLinear);     //设置线性刻度
    customPlot->yAxis2->setScaleType(QCPAxis::stLinear);

    // 设置坐标轴范围
    //    customPlot->xAxis->setRange(0, 19.9);
    customPlot->yAxis->setRange(0, 40);
    customPlot->yAxis->setRangeLower(0);


    //    //设置图表自动缩放
    //    ui->customPlot->rescaleAxes();
    // 使坐标轴范围可拖动和缩放
    customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
    // 设置右上角坐标轴与左下角坐标轴一致
    customPlot->axisRect()->setupFullAxesBox();

    // 使上下轴、左右轴范围同步
    connect(customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), customPlot->xAxis2, SLOT(setRange(QCPRange)));
    connect(customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), customPlot->yAxis2, SLOT(setRange(QCPRange)));

    //定时器连接槽函数realtimeDataSlot
    connect(&dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
    dataTimer.start(0); // 间隔时间 0ms表示尽可能快的触发
}

编写图表添加数据函数

/**
 * @brief  添加数据
 * @param  void
 * @return void
 */
void MainWindow::realtimeDataSlot()
{

    QCustomPlot* customPlot = ui->customPlot;

    static QTime time(QTime::currentTime());

    double key = time.elapsed()/1000.0; // 开始到现在的时间,单位秒
    static double lastPointKey = 0;
    if (key-lastPointKey > 0.001) // 快速添加数据
    {
        // 添加数据到graph
        customPlot->graph(1)->addData(key, Speed_CatTom);
        customPlot->graph(0)->addData(key, Speed_MouseJerry);
        //记录当前时刻
        lastPointKey = key;
    }

    // 曲线能动起来的关键在这里,设定x轴范围为最近8个时刻
    customPlot->xAxis->setRange(key, 8, Qt::AlignRight);
    //绘图
    customPlot->replot();
}

模拟数据更新

//创建一个200ms的定时器模拟数据更新
connect(&GetSpeedTimer, SIGNAL(timeout()), this, SLOT(GetTomAndJerrySpeed()));
    GetSpeedTimer.start(200);       //200ms

//数据更新函数
void MainWindow::GetTomAndJerrySpeed()
{
    qDebug("data update...");
    Speed_CatTom = QRandomGenerator::global()->bounded(0,30);//产生随机数(0-30)
    Speed_MouseJerry = QRandomGenerator::global()->bounded(0,30);//产生随机数(0-30)
}

5.效果展示

在这里插入图片描述
在这里插入图片描述
调整模拟数据更新时间,10ms1次,效果如下:
在这里插入图片描述
在这里插入图片描述

标签:Qt,customPlot,yAxis,缩放,QCustomPlot,图表,xAxis,QT
From: https://blog.csdn.net/qq_27904009/article/details/143493214

相关文章

  • 桌面软件界面能给用户带来完美体验的,还得是QT的设计
    QT的界面设计具有高度的灵活性和可定制性。开发者可以利用QT的丰富工具和库,轻松创建出符合不同用户需求和审美标准的界面。无论是简洁现代的风格,还是复杂华丽的布局,QT都能胜任。其跨平台特性也是一大亮点。无论用户使用的是Windows、Mac还是Linux系统,QT设计的软件界......
  • 【QT】Qt事件
    个人主页~Qt系统相关一、Qt事件1、事件介绍2、事件的处理label.hlabel.cpp3、QKeyEvent按键事件(1)按下单个按键(2)组合键4、QMouseEvent鼠标事件(1)鼠标单击事件(2)鼠标移动事件(3)鼠标滚轮操作5、QTimeEvent定时器事件(1)QTimerEvent(2)QTimer6、事件分发器7、事件过滤器mylab......
  • activemq - mqttv3
    相比于mqtt-client,mqttv3使用的人相对多些,如果出现问题,好排查一些。activemq部署MQTT服务查看文件:conf\activemq.xml,如果包含下面内容,activemq本身已经包含MQTT服务,不需要任何其它配置。activemq不局限于下面这些,还可以继续扩展,比如:NIO、SSL。前往官网查看:https://a......
  • Qt基础学习(三)------第一个程序
    前言    开始进入第一个程序,编写helloword来了解一下程序结构。软件    安装完成后,在开始界面会有一个如下图标的软件。,双击打开,进入到Qt软件界面。进projects,点击NEW新建项目新建窗口项目语言使用默认使用msvc2015的64版本,或者自己有的版本......
  • 解决QT5升级Creator 14.x后出现launch debugger红色报错问题-OK
       QT5升级QtCreator14.x后出现launchdebugger红色报错,QT5C++项目可以编译运行,但无法调试运行。经试验:选择DesktopQT5.15.2MinGW64-bit调试运行无法启动,红色报错。增加安装QT6.7.3后,选择DesktopQT6.7.3MinGW64-bit可以成功进行调试运行。   经过多次测试,发......
  • QT中TextEdit或者QLineEdit以十六进制显示数组数据
    QT中TextEdit以十六进制显示数组数据在Qt(一种跨平台的C++图形用户界面应用程序开发框架)中,如果你想在QTextEdit中以十六进制格式显示数组数据,你可以使用以下步骤:创建一个QTextEdit控件在你的Qt应用程序中创建一个QTextEdit控件,用于显示文本。QTextEdit*textEdit=......
  • Python图像处理库PIL,实现旋转缩放、剪切拼接以及滤波
    文章目录切割缩放和旋转拼接PIL的Image类,提供了一些常用的图像处理方法。切割缩放和旋转PIL可以很方便地实现如下效果代码如下fromPILimportImagepath='lena.jpg'img=Image.open(path)#读取img.resize((50,50),resample=Image.Resampling.NEARES......
  • Geogebra基础篇019—Geogebra的移动工具(单选、框选、沿点线面体拖动、自由旋转、指定
    注意:关注微信公众号“第五智能”,免费查阅全系列文章(或者微信顶部直接搜索“Geogebra的移动工具”就可以找到了)。关于Geogebra移动工具的知识还是比较繁琐的,比如视图中的对象,大家都知道点击单选,但是怎么框选呢?怎么横移画布、怎么沿点拖动、沿线拖动、沿面拖动、甚至是沿体积......
  • 基于YOLO11/v10/v8/v5深度学习的危险驾驶行为检测识别系统设计与实现【python源码+Pyq
    《博主简介》小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~......