Qt Charts 是 Qt 框架中用于数据可视化的核心模块,支持折线图、柱状图、饼图等多种图表类型。
一、模块配置与基础结构
1、项目配置
在 .pro
文件添加模块引用:
QT += charts
代码中需包含头文件及命名空间声明:
#include <QtCharts>
QT_CHARTS_USE_NAMESPACE
2、核心组件
QChartView:作为画布容器,继承自 QGraphicsView,负责图表显示。
QChart:图表主体,管理数据系列、坐标轴及样式。
QAbstractSeries:数据图表系列基类,如 QLineSeries(折线)、QPieSeries(饼图)等。
QValueAxis:数值型坐标轴,用于定义数据范围及刻度。
3、常见图表系列
在 Qt Charts 中,图表是通过不同的图表系列(如线图、柱状图、饼图等)来创建的。每种图表类型都可以通过 QChart
类的 addSeries
方法添加到图表中。以下是几种主要的图表类型:
1)QLineSeries
-
用途:用于显示数据随时间或其他连续变量的变化。
-
示例:股票价格走势、温度变化等。
2)QBarSeries
-
用途:用于显示数据的分类比较,例如不同类别下的数量比较。
-
示例:销售数据按产品分类、成绩按科目分类等。
3)QPieSeries
-
用途:用于显示数据的比例分布,通常用于饼图。
-
示例:市场份额分布、人口分布等。
4)QAreaSeries
-
用途:用于显示数据随时间或其他变量的变化区域,类似于线图但填充颜色。
-
示例:温度变化区域、销售额增长区域等。
5)QScatterSeries
-
用途:用于显示离散数据点,通常用于散点图。
-
示例:实验数据点、地理数据点等。
6)QSplineSeries
-
用途:类似于
QLineSeries
,但曲线平滑连接各点,通常用于平滑的曲线图。 -
示例:平滑的销售趋势线、平滑的温度变化线等。
7)QBoxPlotSeries
-
用途:用于显示数据的分布情况,通过箱形图展示最小值、第一四分位数、中位数、第三四分位数和最大值。
-
示例:数据集的统计分布、实验结果的分布等。
8)QCandlestickSeries
-
用途:用于显示股票或其他金融工具的价格变动,通过蜡烛图展示开盘价、收盘价、最高价和最低价。
-
示例:股票市场分析。
二、图表创建流程
1、创建数据系列并初始化。
2、创建图表,序列添加到图表中。
3、坐标轴配置(可选)。
4、创建一个图表视图,图表绑定与显示。
#include <QApplication>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QChart>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 创建一个线序列
QtCharts::QLineSeries *series = new QtCharts::QLineSeries();
series->append(0, 6);
series->append(1, 4);
series->append(2, 8);
series->append(3, 4);
series->append(4, 7);
// 创建一个图表,并将序列添加到图表中
QtCharts::QChart *chart = new QtCharts::QChart();
chart->legend()->hide();
chart->addSeries(series);
chart->createDefaultAxes();
chart->setTitle("Simple line chart example");
// 创建坐标轴
QValueAxis *axisX = new QValueAxis();
axisX->setRange(0, 5);
axisX->setTitleText("X轴");
QValueAxis *axisY = new QValueAxis();
axisY->setRange(0, 10);
axisY->setTitleText("Y轴");
// 将坐标轴关联到图表
chart->setAxisX(axisX, series);
chart->setAxisY(axisY, series);
// 创建一个图表视图,并将图表设置进去
QtCharts::QChartView *chartView = new QtCharts::QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
chartView->resize(400, 300);
chartView->show();
return a.exec();
}
三、界面集成与样式优化
-
设计器嵌入
-
在 Qt Designer 中拖入 QG
raphicsView
,右键选择 提升为 → 类名填写QChartView
-
代码中通过
ui->widget
获取控件并转换为QChartView
对象。
-
-
代码
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QChart *chart = new QChart();
QLineSeries *series = new QLineSeries();
int n = 0;
for(n=0; n<10; n++)
{
series->append(n, n+5); // 添加数据点,支持链式操作符
}
chart->addSeries(series); // 将数据系列关联到图表
chart->legend()->hide(); // 隐藏图例
QValueAxis *axisX = new QValueAxis();
axisX->setRange(0, 10); // 设置 X 轴范围
axisX->setTitleText("时间"); // 设置轴标题
series->attachAxis(axisX); // 将坐标轴关联到数据系列
chart->addAxis(axisX, Qt::AlignBottom); //将轴添加到图表
ui->graphicsView->setChart(chart);
}
四、Qt中刷新QChart的实现方式
1、完全刷新(清除并重建数据序列)
1)清除所有数据序列
使用 chart->removeAllSeries() 移除当前所有数据系列,确保旧数据不残留。
2)重新添加数据
创建新的 QLineSeries、QBarSeries 等数据系列对象,并通过 chart->addSeries() 添加到图表。
3)重置坐标轴
若坐标轴范围变化,需重新关联数据系列与坐标轴(如 QValueAxis)。
代码片段:
// 清除所有数据序列
chart->removeAllSeries();
// 创建新数据系列并添加数据
QLineSeries *series = new QLineSeries();
series->append(0, 5);
series->append(1, 8);
chart->addSeries(series);
// 重置坐标轴范围
chart->axisX()->setRange(0, 10);
chart->axisY()->setRange(0, 10);
2、动态更新数据(无需重建序列)
1)修改现有数据系列
使用 QLineSeries::replace() 替换数据点。
或通过 append() 追加新数据点3。
2)触发图表刷新
调用 chart->update() 或 series->update() 强制重绘。
代码片段:
// 更新数据点
QVector<QPointF> newPoints;
newPoints << QPointF(2, 12) << QPointF(3, 6);
series->replace(newPoints);
// 强制刷新
chart->update();
3、视图刷新(处理显示残留)
1)手动重绘视图
调用 QChartView::repaint() 或 QChartView::update() 刷新视图显示。
2)重置视图缩放
若缩放导致显示异常,调用 chart->zoomReset() 恢复原始视图。
4、性能优化(高频数据更新)
1)异步更新
使用 QTimer 定时批量更新数据,减少刷新频率。
2)禁用动画效果
通过 chart->setAnimationOptions(QChart::NoAnimation) 关闭动画提升性能。
代码片段:
// 定时器每100ms更新一次数据
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, :ml-search[this] {
// 更新数据并调用 chart->update()
});
timer->start(100);
五、高级功能
1、性能优化
- 启用 OpenGL 加速(仅限支持类型):
series->setUseOpenGL(true); // 利用 GPU 渲染
2、交互支持
- 通过
QChartView
内置方法实现缩放、平移等交互操作。 - 数据点悬停提示(需自定义信号槽处理)。
3、第三方库
-
QCustomPlot
- 该库支持各种类型的图表,如曲线图、散点图、柱状图、饼图、K线图等,而且用户还可以很容易地进行自定义设置和修改。提供更灵活的绘图功能,适合高频数据渲染。
- 需在项目中添加
printsupport
模块:QT += core gui printsupport
。 - 下载地址Qt Plotting Widget QCustomPlot - Introduction
- QCharts与QCustomPlot对比
特性 QCustomPlot QChart 数据量支持 10万+数据点 2000点以内 性能 轻量级,低延迟 依赖图形框架,性能受限 交互功能 支持缩放、拖动等高级操作 基础交互,数据量大时卡顿 开发复杂度 快速集成,易于扩展 需熟悉图形视图框架 视觉效果 简洁 华丽,支持主题
-
stock-charts-cpp股票图
- GitHub项目
zxffffffff/stock-charts-cpp
提供基于C++的股票图表框架,支持技术指标插件化开发。
- GitHub项目