C++使用Qt Charts创建数据可视化图表

Qt Charts 是一个强大的工具,用于创建直观的数据可视化图表。本文将通过一个具体的示例,展示如何使用 Qt Charts 创建一个包含多条数据序列、自定义坐标轴和随机数据生成的图表。

示例代码解析

以下是一个完整的示例代码,展示如何使用 Qt Charts 创建一个数据可视化图表:

cpp 复制代码
#include <QApplication>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QValueAxis>
#include <QRandomGenerator>

using namespace QtCharts;

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    // 设置全局字体
    QFont font("Microsoft YaHei");
    font.setPointSize(10);
    QApplication::setFont(font);

    // 创建图表
    QChart* chart = new QChart();
    chart->setTitle(QStringLiteral("数据可视化图表"));

    // 创建数据序列
    QLineSeries* series0 = new QLineSeries();
    QLineSeries* series1 = new QLineSeries();
    series0->setName(QStringLiteral("数据序列1"));
    series1->setName(QStringLiteral("数据序列2"));

    // 添加数据序列到图表
    chart->addSeries(series0);
    chart->addSeries(series1);

    // 设置图表主题
    chart->setTheme(QChart::ChartThemeLight);

    // 创建坐标轴
    QValueAxis* axisX = new QValueAxis;
    axisX->setRange(1, 100);
    axisX->setTitleText(QStringLiteral("X轴标题"));
    axisX->setLabelFormat("%d %");
    axisX->setTickCount(3);
    axisX->setMinorTickCount(3);

    QValueAxis* axisY = new QValueAxis;
    axisY->setRange(0, 100);
    axisY->setTitleText(QStringLiteral("Y轴标题"));
    axisY->setLabelFormat("%d %");
    axisY->setTickCount(3);
    axisY->setMinorTickCount(3);

    // 将坐标轴附加到图表和数据序列
    chart->addAxis(axisX, Qt::AlignBottom);
    chart->addAxis(axisY, Qt::AlignLeft);
    series0->attachAxis(axisX);
    series0->attachAxis(axisY);
    series1->attachAxis(axisX);
    series1->attachAxis(axisY);

    // 初始化数据
    qreal t = 0, intv = 1;
    for (int i = 1; i < 100; i++) {
        int randomInt = QRandomGenerator::global()->bounded(101);
        int randomInt2 = QRandomGenerator::global()->bounded(84);
        series0->append(t, randomInt2);
        series1->append(t, randomInt);
        t += intv;
    }

    // 创建图表视图
    QChartView* chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);

    // 显示图表
    chartView->resize(800, 600);
    chartView->show();

    return app.exec();
}

代码详解

1. 创建图表

cpp 复制代码
QChart* chart = new QChart();
chart->setTitle(QStringLiteral("数据可视化图表"));
  • 使用 QChart 创建一个图表对象。
  • 设置图表标题。

2. 创建数据序列

cpp 复制代码
QLineSeries* series0 = new QLineSeries();
QLineSeries* series1 = new QLineSeries();
series0->setName(QStringLiteral("数据序列1"));
series1->setName(QStringLiteral("数据序列2"));
  • 使用 QLineSeries 创建两个数据序列。
  • 通过 setName 方法为每个序列设置名称,这些名称会显示在图例中。

3. 添加数据序列到图表

cpp 复制代码
chart->addSeries(series0);
chart->addSeries(series1);
  • 将创建的数据序列添加到图表中。

4. 设置图表主题

cpp 复制代码
chart->setTheme(QChart::ChartThemeLight);
  • 设置图表的主题为浅色主题。

5. 创建坐标轴

cpp 复制代码
QValueAxis* axisX = new QValueAxis;
axisX->setRange(1, 100);
axisX->setTitleText(QStringLiteral("X轴标题"));
axisX->setLabelFormat("%d %");
axisX->setTickCount(3);
axisX->setMinorTickCount(3);

QValueAxis* axisY = new QValueAxis;
axisY->setRange(0, 100);
axisY->setTitleText(QStringLiteral("Y轴标题"));
axisY->setLabelFormat("%d %");
axisY->setTickCount(3);
axisY->setMinorTickCount(3);
  • 使用 QValueAxis 创建 X 轴和 Y 轴。
  • 设置坐标轴的范围、标题、标签格式、刻度数和次刻度数。

6. 将坐标轴附加到图表和数据序列

cpp 复制代码
chart->addAxis(axisX, Qt::AlignBottom);
chart->addAxis(axisY, Qt::AlignLeft);
series0->attachAxis(axisX);
series0->attachAxis(axisY);
series1->attachAxis(axisX);
series1->attachAxis(axisY);
  • 将坐标轴附加到图表,并将数据序列与坐标轴关联。

7. 初始化数据

cpp 复制代码
qreal t = 0, intv = 1;
for (int i = 1; i < 100; i++) {
    int randomInt = QRandomGenerator::global()->bounded(101);
    int randomInt2 = QRandomGenerator::global()->bounded(84);
    series0->append(t, randomInt2);
    series1->append(t, randomInt);
    t += intv;
}
  • 使用 QRandomGenerator 生成随机数据。
  • 将随机数据添加到数据序列中。

8. 创建图表视图并显示

cpp 复制代码
QChartView* chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);

chartView->resize(800, 600);
chartView->show();
  • 使用 QChartView 创建图表视图,并启用抗锯齿渲染。
  • 设置图表视图的大小并显示。

总结

通过上述代码,展示了如何使用 Qt Charts 创建一个数据可视化图表。这个示例包括创建图表、添加数据序列、配置坐标轴、生成随机数据以及显示图表。可以根据实际需求进一步自定义图表的外观和行为。

相关推荐
ULTRA??16 分钟前
Informed RRT*实现椭圆启发式采样
c++·算法
CoderCodingNo28 分钟前
【GESP】C++一级真题 luogu-B4410 [GESP202509 一级] 金字塔
开发语言·c++
超级大福宝29 分钟前
C++中1 << 31 - 1相当于INT_MAX吗?
c语言·c++
alibli43 分钟前
一文学会设计模式之结构型模式及最佳实现
c++·设计模式
A7bert77743 分钟前
【YOLOv5seg部署RK3588】模型训练→转换RKNN→开发板部署
linux·c++·人工智能·深度学习·yolo·目标检测
历程里程碑1 小时前
C++ 10 模板进阶:参数特化与分离编译解析
c语言·开发语言·数据结构·c++·算法
老秦包你会1 小时前
C++进阶------智能指针和特殊类设计方式
开发语言·c++
code bean2 小时前
【CMake 】[第十篇]CMake find_package 完全指南:让第三方库集成变得简单
c++·cmake
IT19952 小时前
C++使用“长度前缀法”解决TCP“粘包 / 拆包”问题
服务器·网络·c++·tcp/ip
Tipriest_2 小时前
旋转矩阵,齐次变换矩阵,欧拉角,四元数等相互转换的常用代码C++ Python
c++·python·矩阵