#ifndef QLINEWIDGET_H
#define QLINEWIDGET_H
#include <QWidget>
#include <QtCharts/QChart>
#include <QtCharts/QChartView>
#include <QtCharts/QPieSeries>
#include <QtCharts/QPieSlice>
#include <QtCharts/QAbstractBarSeries>
#include <QtCharts/QPercentBarSeries>
#include <QtCharts/QStackedBarSeries>
#include <QtCharts/QBarSeries>
#include <QtCharts/QBarSet>
#include <QtCharts/QLineSeries>
#include <QtCharts/QSplineSeries>
#include <QtCharts/QScatterSeries>
#include <QtCharts/QAreaSeries>
#include <QtCharts/QLegend>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QFormLayout>
#include <QtWidgets/QComboBox>
#include <QtWidgets/QSpinBox>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QGroupBox>
#include <QtWidgets/QLabel>
#include <QtCore/QTime>
#include <QtCharts/QBarCategoryAxis>
#include <QtCharts/QChartGlobal>
#include <QtCharts/QValueAxis>
#include "ui_qlinewidget.h"
#ifdef _DEBUG
#pragma comment(lib, "Qt5Chartsd")
#else
#pragma comment(lib, "Qt5Charts")
#endif
QT_CHARTS_USE_NAMESPACE
class QLineWidget : public QWidget
{
Q_OBJECT
public:
QLineWidget(QWidget *parent = 0);
~QLineWidget();
public:
void CreateChart();
public:
void addData(int value);
int timerId;
int maxSize; // data 最多存储 maxSize 个元素
int maxX;
int maxY;
QList<double> data; // 存储业务数据的 list
QChart *chart;
QChartView *chartView;
QSplineSeries *splineSeries;
QScatterSeries *scatterSeries;
QHBoxLayout *layout;
QValueAxis *axisx;
QValueAxis *axisy;
private:
Ui::QLineWidget ui;
};
#endif // QLINEWIDGET_H
#include "qlinewidget.h"
QLineWidget::QLineWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
CreateChart();
}
QLineWidget::~QLineWidget()
{
delete chart;
chart = NULL;
}
void QLineWidget::CreateChart()
{
maxSize = 100; // 只存储最新的 100 个数据
maxX = maxSize;
maxY = 101;
splineSeries = new QSplineSeries();
scatterSeries = new QScatterSeries();
scatterSeries->setMarkerSize(1);
splineSeries->setPointLabelsVisible();
chart = new QChart();
chart->addSeries(splineSeries);
chart->addSeries(scatterSeries);
chart->legend()->hide();
chart->setTitle(QString::fromLocal8Bit("实时动态曲线"));
chart->createDefaultAxes();
chart->axisX()->setRange(0, maxX);
chart->axisY()->setRange(0, maxY);
chartView = new QChartView(chart);
axisx = new QValueAxis;
axisx->setGridLineVisible(true);
axisx->setTitleText("sample time(s)");
chartView->chart()->setAxisX(axisx, splineSeries);
axisy = new QValueAxis;
axisy->setGridLineVisible(true);
axisy->setTitleText("height(meter)");
chartView->chart()->setAxisY(axisy, splineSeries);
chartView->setRenderHint(QPainter::Antialiasing);
layout = new QHBoxLayout();
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(chartView);
setLayout(layout);
}
void QLineWidget::addData(int value)
{
data << value;
// 数据个数超过了最大数量,则删除所有数据,从头开始。
while (data.size() > maxSize)
{
data.clear();
}
// 界面被隐藏后就没有必要绘制数据的曲线了
if (isVisible())
{
splineSeries->clear();
scatterSeries->clear();
int dx = maxX / (maxSize - 1);
for (int i = 0; i < data.size(); ++i)
{
splineSeries->append(i*dx, data.at(i));
scatterSeries->append(i*dx, data.at(i));
}
}
}
//外部widget调用该函数即可
ui.widget->addData(rand() % 100);
使用步骤:
1,主widget下添加一个widget 控件,将该控件提升为QLineWidget。
2,调用addData函数添加数据即可完成绘制。