记录QCharts绘制折线动态图的流程,效果如下:

1 UI文件建立
新建一个 UI 文件后,在界面上添加一个graphicsView控件,并右键“提升为”,将其从基类 QGraphicsView 提升到 QChartView(setChart 是 QChartView 的成员函数)。
2 程序实现
首先需要添加模块charts(VS中是在扩展的 Qt Project Settings 的 Qt Modules 中添加charts)。然后添加对应的头文件:
1 2 3 4 5 6
| #include <QtCharts> QT_CHARTS_USE_NAMESPACE
#include <QChartView> #include <QLineSeries> using namespace QtCharts;
|
使用时在类中定义折线图和坐标轴等数据,然后在初始化函数中对折线图的样式进行自定义设置。
1 2 3 4 5 6 7 8 9 10 11
| class QLineChart : public QWidget { double maxVal; int dataSize;
QChart* m_chart; QLineSeries* m_lineSeries; QValueAxis* m_axisX; QValueAxis* m_axisY; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| void QLineChart::InitLineChart() { QFont font; font.setFamily("SimHei"); font.setPointSize(13);
m_axisX = new QValueAxis(); m_axisY = new QValueAxis(); m_axisX->setTitleText(QStringLiteral("时间 / 帧")); m_axisY->setTitleText(QStringLiteral("定位误差 / %R")); m_axisX->setRange(0, dataSize); m_axisX->setLabelFormat("%d"); m_axisX->setGridLineVisible(true); m_axisX->setTickCount(6); m_axisX->setMinorTickCount(1); m_axisX->setLabelsFont(font); m_axisY->setRange(0, maxVal); m_axisY->setLabelFormat("%u"); m_axisY->setGridLineVisible(true); m_axisY->setTickCount(6); m_axisY->setMinorTickCount(1); m_axisY->setLabelsFont(font);
m_lineSeries = new QLineSeries(); QColor color = QColor(77, 161, 255); m_lineSeries->setPen(QPen(color, 4));
m_chart = new QChart(); m_chart->addSeries(m_lineSeries); m_chart->addAxis(m_axisY, Qt::AlignLeft); m_chart->addAxis(m_axisX, Qt::AlignBottom); font.setPointSize(20); m_chart->setTitleFont(font); m_chart->setTitle(QStringLiteral("协同定位误差折线图")); m_chart->legend()->setVisible(false); m_chart->setAnimationOptions(QChart::SeriesAnimations);
m_lineSeries->attachAxis(m_axisX); m_lineSeries->attachAxis(m_axisY);
ui.graphicsView->setChart(m_chart); ui.graphicsView->setRenderHint(QPainter::Antialiasing); }
|
实现动态功能只需要在定时器中不断添加数据
1
| m_lineSeries->append(m_frame, 1.0 * m_frame / 500);
|
3 问题记录
使用过程中出现了数据点与坐标轴刻度不一致问题,如绘制点(500,1.0)时 y 坐标对应不到1.0,原因是横轴的范围无法平均分配到刻度,即 y 轴范围是 0~5 时setTickCount()设置的值应该是6。