QCustomPlot绘制动态曲线
以下是动态曲线的代码:
在.h文件中输入如下代码:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTimer>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QTimer timerout;
private slots:
void X_AxisDataSlot();
};
#endif // WIDGET_H
在构造函数中输入如下函数,
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QtMath>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QCustomPlot *dynamic = ui->qcustomplot;
dynamic->addGraph(); //添加图形一
dynamic->graph(0)->setPen(QPen(QColor(255, 0, 0)));
dynamic->addGraph(); //添加图形二
dynamic->graph(1)->setPen(QPen(QColor(0, 0, 255)));
dynamic->axisRect()->setupFullAxesBox();
// dynamic->xAxis2->setVisible(true);
// dynamic->xAxis2->setTickLabels(false);
// dynamic->yAxis2->setVisible(true);
// dynamic->yAxis2->setTickLabels(false);
dynamic->yAxis->setRange(-1.1, 1.1); //设置y轴的范围
// 使上下轴、左右轴范围同步
connect(dynamic->xAxis, SIGNAL(rangeChanged(QCPRange)), dynamic->xAxis2, SLOT(setRange(QCPRange)));
connect(dynamic->yAxis, SIGNAL(rangeChanged(QCPRange)), dynamic->yAxis2, SLOT(setRange(QCPRange)));
connect(&timerout, SIGNAL(timeout()), this, SLOT(X_AxisDataSlot()));
timerout.start(0);
//使用鼠标拖动轴范围,使用鼠标滚轮缩放,并通过单击选择图形:
dynamic->setInteractions(QCP::iRangeDrag |
QCP::iRangeZoom | QCP::iSelectPlottables);
}
Widget::~Widget()
{
delete ui;
}
void Widget::X_AxisDataSlot()
{
QCustomPlot *dynamic = ui->qcustomplot;
static QTime time(QTime::currentTime());
double key = time.elapsed()/1000.0; // 开始到现在的时间,单位秒
qDebug() << key;
static double lastKey = 0;
if (key - lastKey > 0.002) // 大约2ms添加一次数据
{
//添加数据到graph
dynamic->graph(0)->addData(key, qSin(key));
dynamic->graph(1)->addData(key, qCos(key));
lastKey = key; //记录当前时刻
}
dynamic->legend->setVisible(true); //图例可见
dynamic->graph(0)->setName(tr("cos")); //设置线名
dynamic->legend->setVisible(true); //图例可见
dynamic->graph(1)->setName(tr("sin")); //设置线名
dynamic->xAxis->setLabel("x Label"); // 设置x轴的标签
dynamic->yAxis->setLabel("y Label"); // 设置y轴的标签
// 曲线能动起来的关键
dynamic->xAxis->setRange(key, 8, Qt::AlignRight);
//重绘图
dynamic->replot();
}
运行结果如下(图是动态的,为了方便我没有录制动态,是直接截图的):
部分代码解析:
dynamic->xAxis->setRange(key, 8, Qt::AlignRight);
每次添加数据后调用一次setRange(key, 8, Qt::AlignRight),由于函数中是调用Qt::AlignRight,所以每次最新的数据的key值当做x轴数据显示在右边,原来最左边的数据被挤了出去。就是新的数据每次都想挤在x轴的右边,旧的数据就被往左边挤,看起来曲线整体向左移了。
setRange()函数的官方说明:
void QCPAxis::setRange (const QCPRange & range)
翻译:
设置轴的范围。
此插槽可能与另一个轴的rangeChanged信号连接,因此当其变化时,该轴始终与另一个轴范围同步。
要反转轴的方向,请使用setRangeReversed。
void QCPAxis::setRange (double lower, double upper)
翻译:
设置轴范围的下限和上限。
要反转轴的方向,请使用setRangeReversed。
void QCPAxis::setRange (double position, double size, Qt::AlignmentFlag alignment )
翻译:
设置轴的范围。
位置坐标与对齐参数一起指示新范围的位置。大小定义新轴范围的大小。
对齐方式可以是Qt: :AlignLeft、Qt::AlignRight 或 Qt::AlignCenter。
这将导致左边框、右边框或范围中心与位置对齐。
对齐的任何其他值将默认为Qt::AlignCenter。