Qt实战开发-动态曲线图

实现的方法
1.使用第三方的Qt库,qcustomplot库
2.建立一个窗体作为子窗口
3.添加曲线
4.对需要的属性进行设置

实现过程
首先从网上下载第三方的库qcustonplot,然后建立一个工程,把qcustonplot相对应的.cpp,.h文件添加上
下面贴出对应的工程.h代码

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>
#include <qmath.h>
#include <QTimer>
#include <qcustomplot/qcustomplot.h>
#include <QString>
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    double value0;
    double key;
    QString  CureName;//设置曲线名字
    QCustomPlot *customPlot;
    QCPItemText *textLabel;
    QCPItemText *textLabel2;

private slots:
   void realtimeDataSlot();
};

#endif // WIDGET_H

其中添加来实现定时的动态刷新
double value0; //存放的是关于曲线的数据值
double key; //与控制轴数据相关
QString CureName;//设置曲线名字
QCustomPlot *customPlot;
QCPItemText *textLabel; //可以显示文本
QCPItemText *textLabel2;

下面将一点点的来描述.cpp中的内容

首先

#include "widget.h"
#include <QLabel>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{

    //建立一个曲线图表
    customPlot = new QCustomPlot(this);
    customPlot->setObjectName(QString::fromUtf8("customPlot"));
    customPlot->setBackground(Qt::white); //设置背景颜色
    customPlot->setGeometry(QRect(130, 120, 800, 400)); //设置 位置 高度

}
首先使用 QCustomPlot *customPlot; 来实例化一个对象,
随后设置名字,设置背景色,设置显示的位置。和大小。顺便说一下setGeometry函数在存在布局的情况下是无法是指大小的(要注意)。
设置完毕后会显示默认的坐标值。如下图
![这里写图片描述](https://img-blog.youkuaiyun.com/20170226195635213?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT3NlYW5fbGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这样一个坐标以就已经建好了
下面就是添加曲线了

customPlot->plotLayout()->insertRow(0);
customPlot->plotLayout()->addElement(0, 0, new QCPPlotTitle(customPlot, "Cure")); //插入一行并且添加一个标题元素
customPlot->addGraph(); 
customPlot->graph(0)->setPen(QPen(Qt::blue));
customPlot->graph(0)->setBrush(QBrush(QColor(240, 255, 200)));
在刚刚建立的坐标系中可以显示多条曲线。insertRow(0)表示只是添加一条
第二行 设置坐标的标题,addElement的参数的含义 可以看具体的函数定义(在这里 是 (x,y)的坐标 ,和显示的标题字符)
第三行是添加曲线的函数
第四行 设置线色
第五行 设置填充的颜色,在此程序中是曲线与时间轴围成的部分
这样曲线的部分就设置好了

接下来设置坐标轴的配置

//x坐标轴设置
customPlot->xAxis->setLabel(“time:”);//设置坐标名字
customPlot->xAxis->setLabelColor(Qt::black);//设置坐标颜色
customPlot->xAxis->setLabelPadding(1);//设置坐标轴名称文本距离坐标轴刻度线距离
//y坐标轴设置
customPlot->yAxis->setAutoTickStep(false); ////设置是否自动分配刻度间距
customPlot->yAxis->setTickStep(25);// 数值的大小是y轴的一半,设置刻度间距
customPlot->yAxis->setLabelColor(QColor(0, 160, 230)); //设置文本颜色
customPlot->yAxis->setRange(-50,50); //y轴的范围

customPlot->xAxis2-> setTicks(false); //不显示坐标轴
customPlot->yAxis2-> setTicks(false); //不显示坐标轴

程序中对每行都做了注释,每行的具体功能不再叙述。只是做几点补充 xAxis xAxis2 yAxis yAxis2  分别表示的是坐标系的四个边。

接下来要用到定时,来时线动态的效果
下面的两段代码分别是触发的条件,和执行的动作

value0=1; //测试用到
key=7;
QTimer *dataTimer = new QTimer(this);
connect(dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
dataTimer->start(1000);

定时执行的内容

void Widget::realtimeDataSlot()
{
key++;
static double lastPointKey = 0;
if (key-lastPointKey > 0.01) // at most add point every 10 ms
{
//测试用
if(value0>0 && value0<10)
{
value0=value0+5;
}
else {value0=5;}

    customPlot->graph(0)->addData(key, value0);
    lastPointKey = key;

}

textLabel->setText("Current:"+QString::number( value0 )); //显示当前值
customPlot->xAxis->setAutoTickStep(false);  ////设置是否自动分配刻度间距
customPlot->xAxis->setTickStep(1);// 数值的大小是y轴的一半,设置刻度间距
customPlot->xAxis->setRange(key,8,Qt::AlignRight);
customPlot->replot();

}

上面测试用的部分,就是周期的给alue0赋值,来改变曲线。时间轴可以设置成系统时间

这里只想强调     customPlot->xAxis->setRange(key,8,Qt::AlignRight); 这行代码,要想实现动态,就要不仅不断地改变y值,还要改变x值的内容。如果不改变x轴,那么超过当前的x坐标轴就不会动态显示了。AlignRight的作用是右对齐的方式显示,也是很关键的,选择左对齐是没有数据的,不是因为不显示,因为只能够显示当前的点,就是一个数据点。

这样一个动态曲线就绘制好了

下面在添加一个实时显示当前值的功能

//显示当前数值文本
textLabel = new QCPItemText(customPlot);
customPlot->addItem(textLabel);
textLabel->setPositionAlignment(Qt::AlignTop); //布局内控件
textLabel->position->setType(QCPItemPosition::ptAxisRectRatio); //按比例设置位置,依赖于坐标轴矩形大小,区别于按视口大小
textLabel->position->setCoords(0, 0); // place position at center/top of axis rect
textLabel->setFont(QFont(font().family(), 15));
textLabel->setPen(QPen(Qt::black));

//在定时函数中
textLabel->setText("Current:"+QString::number( value0 )); //显示当前值
关键的代码   textLabel->position->setCoords(0, 0); setCoords函数显示的坐标的区间是[0,1].(0.5,0.5)就是坐标系的中心位置。

widget.cpp文件如下

include “widget.h”

include

Widget::Widget(QWidget *parent)
: QWidget(parent)
{

//建立一个曲线图表
customPlot = new QCustomPlot(this);
customPlot->setObjectName(QString::fromUtf8("customPlot"));
customPlot->setBackground(Qt::white); //设置背景颜色
customPlot->setGeometry(QRect(130, 120, 800, 400)); //设置 位置 高度



customPlot->plotLayout()->insertRow(0);
customPlot->plotLayout()->addElement(0, 0, new QCPPlotTitle(customPlot, "Cure")); //插入一行并且添加一个标题元素
customPlot->addGraph(); // blue line
customPlot->graph(0)->setPen(QPen(Qt::blue));
customPlot->graph(0)->setBrush(QBrush(QColor(240, 255, 200)));
customPlot->graph(0)->setAntialiasedFill(false);

//显示当前数值文本
textLabel = new QCPItemText(customPlot);
customPlot->addItem(textLabel);
textLabel->setPositionAlignment(Qt::AlignTop); //布局内控件
textLabel->position->setType(QCPItemPosition::ptAxisRectRatio); //按比例设置位置,依赖于坐标轴矩形大小,区别于按视口大小
textLabel->position->setCoords(0, 0); // place position at center/top of axis rect
textLabel->setFont(QFont(font().family(), 15)); // make font a bit larger
textLabel->setPen(QPen(Qt::black)); // show black border around text

//设置当前曲线名字文本

textLabel2 = new QCPItemText(customPlot);
customPlot->addItem(textLabel2);
textLabel2->setPositionAlignment(Qt::AlignBottom);
textLabel2->position->setType(QCPItemPosition::ptAxisRectRatio);
textLabel2->position->setCoords(0, 1.0);
textLabel2->setFont(QFont(font().family(), 15)); // make font a bit larger
textLabel2->setPen(QPen(Qt::black)); // show black border around text
CureName=”123”;//设置曲线名字
textLabel2->setText(“CureName:”+CureName); //显示当前值

//x坐标轴设置
customPlot->xAxis->setLabel(“time:”);//设置坐标名字
customPlot->xAxis->setLabelColor(Qt::black);//设置坐标颜色
customPlot->xAxis->setLabelPadding(1);//设置坐标轴名称文本距离坐标轴刻度线距离
//y坐标轴设置
customPlot->yAxis->setAutoTickStep(false); ////设置是否自动分配刻度间距
customPlot->yAxis->setTickStep(25);// 数值的大小是y轴的一半,设置刻度间距
customPlot->yAxis->setLabelColor(QColor(0, 160, 230)); //设置文本颜色
customPlot->yAxis->setRange(-50,50); //y轴的范围

customPlot->xAxis2-> setTicks(false); //不显示坐标轴
customPlot->yAxis2-> setTicks(false); //不显示坐标轴

value0=1; //测试用到
key=7;
QTimer *dataTimer = new QTimer(this);
connect(dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
dataTimer->start(1000);

}

Widget::~Widget()
{

}
void Widget::realtimeDataSlot()
{
key++;
static double lastPointKey = 0;
if (key-lastPointKey > 0.01) // at most add point every 10 ms
{
//测试用
if(value0>0 && value0<10)
{
value0=value0+5;
}
else {value0=5;}

    customPlot->graph(0)->addData(key, value0);
    lastPointKey = key;

}

textLabel->setText("Current:"+QString::number( value0 )); //显示当前值
customPlot->xAxis->setAutoTickStep(false);  ////设置是否自动分配刻度间距
customPlot->xAxis->setTickStep(1);// 数值的大小是y轴的一半,设置刻度间距
customPlot->xAxis->setRange(key,8,Qt::AlignRight);
customPlot->replot();

}

“`

效果图如下这里写图片描述

完整的源码下载
http://download.youkuaiyun.com/detail/osean_li/9764635

<think>好的,我现在需要处理用户关于在Qt中绘制动态曲线图的第三方库的问题。首先,用户已经提到了QtCharts,并引用了两篇相关的文章。我需要确认用户是否已经了解Qt自带的QtCharts库,或者他们是否在寻找其他第三方库作为补充或替代。 首先,我应该回顾一下QtCharts的基本功能。根据用户提供的引用,QtCharts可以绘制样条曲线图动态曲线实时显示。比如引用[1]中提到了使用QtCharts绘制样条曲线图的步骤和代码,引用[2]则介绍了实时绘制的示例。这说明QtCharts本身具备一定的动态曲线绘制能力,用户可能已经尝试过,但可能遇到了性能或功能上的限制,所以才会寻求第三方库。 接下来,我需要考虑用户的需求场景。动态曲线图通常需要高效的数据更新和渲染能力,尤其是在实时数据展示时,比如传感器数据、实时监控等。如果QtCharts无法满足性能需求,或者用户需要更复杂的图表类型,可能需要第三方库的支持。 然后,我应该列出Qt中常用的第三方图表库。常见的选项包括QCustomPlot、QWT、Qt Data Visualization模块,以及一些跨平台的库如Matplotlib与Qt结合使用。需要逐个分析这些库的特点,是否支持动态曲线,实时性能如何,以及集成到Qt中的难易程度。 QCustomPlot是一个轻量级的Qt绘图库,专注于2D图表,支持实时数据更新,性能较好,适合需要高频更新的场景。用户评价通常不错,文档也较为完善,这可能是一个好的推荐。 QWT(Qt Widgets for Technical Applications)是另一个历史较久的库,适用于科学和工程应用,提供丰富的控件如曲线图、柱状图等。但它的学习曲线可能较陡,且对新版Qt的支持可能需要确认,比如是否支持Qt5或Qt6。 Qt Data Visualization模块是Qt官方的一部分,主要用于3D图表,但如果用户需要3D效果,这可能相关,但动态2D曲线可能不是其强项。 第三方库如Matplotlib虽然强大,但通过嵌入到Qt中可能需要使用Qt的绘图部件或者将图像导出,这样实时性可能不如原生库。另外,可能需要结合其他工具如PyQt或C++绑定,这可能增加复杂性。 另外,用户可能需要考虑跨平台支持和许可证问题。例如,QCustomPlot是GPL许可,如果需要商业用途,可能需要购买商业许可证。而QWT同样采用GPL,需要注意这一点。 接下来,我需要确保推荐的库有良好的文档和社区支持,这样用户在集成和使用过程中遇到问题时能够找到帮助。例如,引用[2]中的示例代码链接可能帮助用户开始使用QtCharts,但如果需要更高性能,QCustomPlot可能更合适。 最后,用户可能需要示例代码或集成步骤。例如,使用QCustomPlot时,如何添加数据点,如何设置定时器刷新等。这些细节可以帮助用户更快地上手。 总结下来,可能的第三方库推荐顺序是:QCustomPlot、QWT,然后是其他选项。同时需要提醒用户Qt自带的QtCharts可能已经足够,但在性能或功能不足时再考虑第三方库。</think>在Qt中绘制动态曲线图,除了自带的QtCharts模块外,还可以考虑以下第三方库: --- ### 1. **QCustomPlot** - **特点**:轻量级、高性能的Qt绘图库,专为实时数据可视化设计,支持动态曲线刷新和交互操作。 - **优势**: -Qt实现,无需外部依赖 - 支持实时数据更新(每秒万级数据点)[^1] - 提供丰富的图表类型(曲线、柱状图、散点图等) - **集成方式**: - 下载源码后直接添加`qcustomplot.h`和`qcustomplot.cpp`到项目 - 示例代码片段: ```cpp QCustomPlot *plot = new QCustomPlot; plot->addGraph(); plot->graph(0)->setData(xData, yData); plot->replot(); // 动态刷新 ``` --- ### 2. **QWT (Qt Widgets for Technical Applications)** - **特点**:面向科学和工程应用的库,适合高精度动态曲线绘制。 - **优势**: - 支持大规模数据集和复杂数学运算 - 提供刻度标记、图例等专业控件[^2] - **注意**: - 需要编译安装,对Qt6支持有限(主要适配Qt5) - 开源协议为GPL,商用需授权 --- ### 3. **Qt Data Visualization** - **特点**:Qt官方3D图表模块,适合需要3D动态效果(如曲面波动)的场景。 - **示例场景**: - 实时3D频谱分析 - 动态热力图 --- ### 4. **Matplotlib (通过Python绑定)** - **特点**:通过PyQt/PySide嵌入Python的Matplotlib图表。 - **适用场景**: - 快速验证算法时结合Python脚本 - 需要复杂数学计算时(如傅里叶变换) --- ### 性能对比建议 | 库名称 | 实时性 | 开发难度 | 适用场景 | |----------------|--------|----------|-------------------| | QtCharts | 中 | 低 | 基础动态曲线 | | QCustomPlot | 高 | 中 | 高频数据刷新 | | QWT | 中高 | 高 | 科学/工程应用 | | Matplotlib | 低 | 中 | 复杂计算+可视化 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值