QChart使用

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();
}

三、界面集成与样式优化

  1. 设计器嵌入

    • 在 Qt Designer 中拖入 QGraphicsView,右键选择 ‌提升为‌ → 类名填写 QChartView

    • 代码中通过 ui->widget 获取控件并转换为 QChartView 对象‌。

  2. 代码

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对比
      特性QCustomPlotQChart
      数据量支持10万+数据点‌2000点以内‌
      性能轻量级,低延迟‌依赖图形框架,性能受限‌
      交互功能支持缩放、拖动等高级操作‌基础交互,数据量大时卡顿‌
      开发复杂度快速集成,易于扩展‌需熟悉图形视图框架‌
      视觉效果简洁华丽,支持主题‌
  • ‌stock-charts-cpp股票图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byxdaz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值