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 创建一个数据可视化图表。这个示例包括创建图表、添加数据序列、配置坐标轴、生成随机数据以及显示图表。可以根据实际需求进一步自定义图表的外观和行为。

相关推荐
星竹晨L2 小时前
C++继承机制:面向对象编程的基石
开发语言·c++
9ilk3 小时前
【仿RabbitMQ的发布订阅式消息队列】--- 模块设计与划分
c++·笔记·分布式·后端·中间件·rabbitmq
恒者走天下3 小时前
面试的时候项目怎么聊,才能发挥最大的价值
c++
阿巴~阿巴~4 小时前
线程局部存储(Thread-Local Storage, TLS)
linux·服务器·开发语言·c++·线程·虚拟地址空间·线程局部存储
上去我就QWER4 小时前
深入理解 Qt 信号槽机制
qt
杨筱毅5 小时前
【C++】【C++面试】Android SO 体积优化技术点梳理
c++·面试
万能的小裴同学5 小时前
C++ 鸭科夫手柄适配
开发语言·c++·算法
代码AC不AC5 小时前
【C++】哈希表实现 - 链地址法/哈希桶
c++·哈希算法·哈希·哈希桶·链地址法
小杰帅气5 小时前
STL_List简单使用
开发语言·c++·list
清辞8535 小时前
C++数据结构(链表和list)
数据结构·c++·链表