1、前言
记录一下QChart绘制折线图点的实现方法,方便自己会顾,也可以给有需要的人提供帮助。 |
2、QChart绘制折线图实现步骤
2.1 在.pro文件中添加charts模块
QT += core gui serialport serialbus charts

2.2 添加头文件
#include <QWidget>
#include <QtCharts>
#include <QPoint>
#include <QLineSeries>
#include <QValueAxis>
#include <QPoint>
#include <QChartView>
QT_CHARTS_USE_NAMESPACE

2.3 创建图表对象和相关组件
QChart *chart;
QValueAxis *axisX;
QValueAxis *axisY;
QLineSeries *series;
QElapsedTimer startTimer;

2.4 初始化图表对象和相关组件
chart = new QChart();
axisX = new QValueAxis();
axisY = new QValueAxis();
series = new QLineSeries();

2.5 配置x轴和y轴
axisX->setTitleText("时间(s)");
axisX->setLabelFormat("%d");
axisX->setRange(0,60);
axisY->setTitleText("流量 (mL/min)");
axisY->setLabelFormat("%.1f");
axisY->setRange(100, 600);
2.6 将系列添加到图表
chart->addSeries(series);
注:必须在添加坐标轴前将系列加入图表
2.7 将坐标轴添加到图表
chart->addAxis(axisX,Qt::AlignBottom);
chart->addAxis(axisY,Qt::AlignLeft);
2.8 将系列附加到坐标轴
series->attachAxis(axisX);
series->attachAxis(axisY);
2.9 配置图表属性
chart->setTitle("流量实时曲线");
chart->setAnimationOptions(QChart::NoAnimation);
chart->legend()->show();
2.10 创建图表视图
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
2.11 设置布局显示
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(chartView);
this->setLayout(layout);
2.12 添加数据点
void graph::addDataPoint(float flowValue)
{
double elapsedMinutes = startTimer.elapsed() / 1000.0;
series->append(elapsedMinutes, flowValue);
qDebug() << "添加数据点:" << flowValue << "mL/min";
if(series->count() > 60)
{
series->removePoints(0, series->count() - 60);
}
double maxX = elapsedMinutes;
double minX = qMax(0.0, maxX - 60);
axisX->setRange(minX, maxX);
double minY = 0;
double maxY = 0;
for(int i = 0; i < series->count(); i++)
{
QPointF point = series->at(i);
if (point.x() >= minX) {
if (point.y() < minY || minY == 0)
{
minY = point.y();
}
if (point.y() > maxY)
{
maxY = point.y();
}
}
}
double margin = (maxY - minY) * 0.1;
if (margin == 0)
{
margin = maxY > 0 ? maxY * 0.1 : 10;
}
minY = qMax(0.0, minY - margin);
maxY += margin;
axisY->setRange(minY, maxY);
}
3、.h文件和.cpp文件
3.1 graph.h文件
#ifndef GRAPH_H
#define GRAPH_H
#include <QWidget>
#include <QtCharts>
#include <QPoint>
#include <QLineSeries>
#include <QValueAxis>
#include <QPoint>
#include <QChartView>
QT_CHARTS_USE_NAMESPACE
namespace Ui {
class graph;
}
class graph : public QWidget
{
Q_OBJECT
public:
explicit graph(QWidget *parent = nullptr);
~graph();
public slots:
void addDataPoint(float flowValue);
private:
Ui::graph *ui;
QChart *chart;
QValueAxis *axisX;
QValueAxis *axisY;
QLineSeries *series;
QElapsedTimer startTimer;
};
#endif
3.2 graph.cpp
#include "graph.h"
#include "ui_graph.h"
graph::graph(QWidget *parent)
: QWidget(parent)
, ui(new Ui::graph)
{
ui->setupUi(this);
chart = new QChart();
axisX = new QValueAxis();
axisY = new QValueAxis();
series = new QLineSeries();
axisX->setTitleText("时间(s)");
axisX->setLabelFormat("%d");
axisX->setRange(0,60);
axisY->setTitleText("流量 (mL/min)");
axisY->setLabelFormat("%.1f");
axisY->setRange(100, 600);
chart->addSeries(series);
chart->addAxis(axisX,Qt::AlignBottom);
chart->addAxis(axisY,Qt::AlignLeft);
series->attachAxis(axisX);
series->attachAxis(axisY);
chart->setTitle("流量实时曲线");
chart->setAnimationOptions(QChart::NoAnimation);
chart->legend()->show();
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(chartView);
this->setLayout(layout);
startTimer.start();
}
graph::~graph()
{
delete ui;
}
void graph::addDataPoint(float flowValue)
{
double elapsedMinutes = startTimer.elapsed() / 1000.0;
series->append(elapsedMinutes, flowValue);
qDebug() << "添加数据点:" << flowValue << "mL/min";
if(series->count() > 60)
{
series->removePoints(0, series->count() - 60);
}
double maxX = elapsedMinutes;
double minX = qMax(0.0, maxX - 60);
axisX->setRange(minX, maxX);
double minY = 0;
double maxY = 0;
for(int i = 0; i < series->count(); i++)
{
QPointF point = series->at(i);
if (point.x() >= minX) {
if (point.y() < minY || minY == 0)
{
minY = point.y();
}
if (point.y() > maxY)
{
maxY = point.y();
}
}
}
double margin = (maxY - minY) * 0.1;
if (margin == 0)
{
margin = maxY > 0 ? maxY * 0.1 : 10;
}
minY = qMax(0.0, minY - margin);
maxY += margin;
axisY->setRange(minY, maxY);
}
4、总结
以上就是QChart绘制折线图的整个过程了,浏览过程中,如若发现错误,欢迎大家指正,有问题的可以评论区留言或者私信。最后,如果大家觉得有所帮助的话,可以点个赞,谢谢大家!祝大家平安无疾,皆得所愿! |