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

相关推荐
小坏坏的大世界4 小时前
C++ STL常用容器总结(vector, deque, list, map, set)
c++·算法
liulilittle5 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
励志要当大牛的小白菜6 小时前
ART配对软件使用
开发语言·c++·qt·算法
PAK向日葵7 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
QQ_43766431412 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
liulilittle13 小时前
C++/CLI与标准C++的语法差异(一)
开发语言·c++·.net·cli·clr·托管·原生
小狄同学呀13 小时前
VS插件报错,g++却完美编译?API调用错因分析
c++
程序员编程指南13 小时前
Qt 数据库连接池实现与管理
c语言·数据库·c++·qt·oracle
小乖兽技术13 小时前
C#与C++交互开发系列(二十四):WinForms 应用中嵌入C++ 原生窗体
c++·c#·交互
张北北.14 小时前
【深入底层】C++开发简历4+4技能描述6
java·开发语言·c++