QT6中QChart功能与应用
一.概述
1.简介
在 Qt 框架中,QChart是Qt Charts 模块的核心类,用于创建、管理和展示各种交互式图表,支持数据可视化功能。Qt Charts 基于 Qt 的图形系统(支持 Qt Widgets 和 Qt Quick),提供了丰富的图表类型、交互能力和定制化选项,广泛应用于需要直观展示数据趋势、对比关系或分布特征的场景。
2.核心功能
QChart的核心作用是将数据以图表形式可视化,并提供灵活的配置和交互能力。
其主要功能包括:
(1)支持多种图表类型
折线图(QLineSeries):展示数据随时间或连续变量的变化趋势(如温度变化、股票走势)。
柱状图(QBarSeries):对比不同类别数据的数值(如各部门销售额、不同产品销量)。
饼图(QPieSeries):展示各部分占总体的比例(如市场份额、资源分配占比)。
散点图(QScatterSeries):显示变量间的相关性(如身高与体重的关系、实验数据分布)。
面积图(QAreaSeries):在折线图基础上填充区域,强调数据范围(如累计用户增长)。
雷达图(QRadarSeries):多维度数据对比(如不同产品在多项指标上的评分)。
箱线图(QBoxPlotSeries):展示数据分布特征(如数据集的中位数、四分位范围)。
组合图表:同一图表中叠加多种类型(如折线图 + 柱状图,同时展示趋势和对比)。
(2)丰富的交互能力
缩放与平移:通过鼠标滚轮缩放图表(聚焦细节),拖拽平移(浏览大范围数据)。
数据点提示:鼠标悬停在数据点上时,显示具体数值(需配合QToolTip或自定义提示框)。
图例交互:点击图例中的系列名称,可隐藏 / 显示对应数据系列(快速对比不同数据组)。
坐标轴联动:多图表共享坐标轴时,缩放一个图表会同步影响其他图表(适合多维度数据关联分析)。
选择功能:支持点击选中单个数据点或数据系列(如选中某根柱子查看详细信息)。
(3)高度定制化配置
QChart允许开发者深度定制图表外观和行为,适配不同场景的 UI 需求:
标题与图例:设置图表标题(setTitle())、图例位置(setLegendAlignment())、字体和颜色。
坐标轴定制:
支持线性轴(QValueAxis)、分类轴(QCategoryAxis)、时间轴(QDateTimeAxis)等;
可设置坐标轴范围、刻度间隔、标签格式(如日期格式化、数值单位);
支持双 Y 轴(左右两侧分别对应不同数据系列,如左侧显示销量、右侧显示增长率)。
样式美化:自定义数据系列的颜色、线条粗细、点标记形状(如折线图的点用圆形 / 方形标记);柱状图的柱形颜色、间距等。
动画效果:添加数据加载或更新时的过渡动画(如柱状图渐入、折线图绘制动画),提升视觉体验。
(4)动态数据更新
QChart支持实时数据刷新,适合动态监控场景:
通过QAbstractSeries的append()、remove()等方法动态添加 / 删除数据点;
配合QTimer定期更新数据,图表会自动重绘(无需手动刷新);
支持数据范围自动调整(如坐标轴随新数据自动扩展范围)。
(5)跨平台与多框架支持
跨平台兼容:在 Windows、macOS、Linux、嵌入式系统等平台上保持一致的显示和交互效果。
多框架集成:可嵌入 Qt Widgets 界面(通过QChartView)或 Qt Quick 界面(通过ChartView元素),适配不同的 UI 开发方式。
二.代码示例
1.头文件:
#include <QChart>
#include <QChartView>
#include <QLineSeries>
#include <QBarSeries>
#include <QBarSet>
#include <QValueAxis>
pro文件添加:
QT += charts
2.创建数据系列-曲线图
QLineSeries *series = new QLineSeries();
series->setName("数据系列");
// 添加数据点
series->append(0, 6);
series->append(1, 3);
series->append(2, 4);
series->append(3, 8);
series->append(4, 7);
series->append(5, 2);
// 创建图表
QChart *chart = new QChart();
chart->addSeries(series);
chart->setTitle("简单折线图");
chart->setAnimationOptions(QChart::SeriesAnimations);
// 创建坐标轴
chart->createDefaultAxes();
// 创建图表视图
QChartView *chartView = new QChartView(chart,this);
chartView->setRenderHint(QPainter::Antialiasing);
chartView->resize(800, 600);
3.创建图表-柱状图
QChart *chart = new QChart();
chart->setTitle("QChart 多序列(模拟图层)示例");
// 2. 序列1:折线图(底层)
QLineSeries *lineSeries = new QLineSeries();
lineSeries->setName("折线序列(底层)");
lineSeries->append(0, 1);
lineSeries->append(1, 3);
lineSeries->append(2, 2);
lineSeries->setOpacity(0.7); // 半透明
// lineSeries->setZValue(1); // 层级1(较低)
chart->addSeries(lineSeries);
// 3. 序列2:柱状图(顶层)
QBarSet *barSet = new QBarSet("数据");
*barSet << 2 << 1 << 3;
QBarSeries *barSeries = new QBarSeries();
barSeries->append(barSet);
barSeries->setName("柱状序列(顶层)");
// barSeries->setZValue(2); // 层级2(较高,显示在折线图上方)
chart->addSeries(barSeries);
// 4. 设置坐标轴
QValueAxis *axisX = new QValueAxis();
QValueAxis *axisY = new QValueAxis();
chart->setAxisX(axisX, lineSeries);
chart->setAxisY(axisY, lineSeries);
chart->setAxisX(axisX, barSeries);
chart->setAxisY(axisY, barSeries);
// 5. 显示图表
QChartView *chartView = new QChartView(chart,this);
chartView->setRenderHint(QPainter::Antialiasing);
chartView->resize(800, 600);
chartView->show();