当前位置: 首页 > news >正文

QT 图表(拆线图,栏状图,饼状图 ,动态图表)

效果

折线图

// 创建折线数据系列
    // 创建折线系列
    QLineSeries *series = new QLineSeries;
    // series->append(0, 6);
    // series->append(2, 4);
    // series->append(3, 8);

    // 创建图表并添加系列
    QChart *chart = new QChart;
    chart->addSeries(series);
    chart->setTitle("实时数据监控");
    chart->setAnimationOptions(QChart::SeriesAnimations); // 启用动画

    // 显式创建轴(Qt6 兼容)
    QValueAxis *axisX = new QValueAxis;
    QValueAxis *axisY = new QValueAxis;
    chart->addAxis(axisX, Qt::AlignBottom);
    chart->addAxis(axisY, Qt::AlignLeft);
    series->attachAxis(axisX);
    series->attachAxis(axisY);

    axisX->setTitleText("时间");
    axisY->setTitleText("数值");
    axisX->setRange(0, 10);//设置范围
    axisY->setRange(0, 100);

    // 将图表嵌入到 QChartView 中显示
    // QChartView *chartView = new QChartView(chart);
    // chartView->setRenderHint(QPainter::Antialiasing); // 抗锯齿
    // chartView->resize(800, 600);
    //this->setCentralWidget(chartView);
    //代码中绑定到布局
    //ui->verticalLayout->addWidget(chartView); // 添加到布局

    ui->chartViewLine->setChart(chart);
    ui->chartViewLine->setRenderHint(QPainter::Antialiasing); // 抗锯齿

    // 动态更新数据
    // 定时器动态追加数据
    QTimer *timer = new QTimer(this);
    QObject::connect(timer, &QTimer::timeout, [=]() {
        static int currentX = 0;// 当前数据点的 X 值
        //动态添加数据
        series->append(currentX, QRandomGenerator::global()->bounded(100));

        axisX->setMax(currentX); // 自动扩展 X 轴范围

        // 控制数据量不超过30个
        // if (series->count() > 30) {
        //     series->remove(0);  // 移除最旧的点
        // }
        // // 动态调整 X 轴范围,显示最近30个点
        // if (currentX >= 30) {
        //     axisX->setRange(currentX - 29, currentX);
        // } else {
        //     axisX->setRange(0, currentX);
        // }

        if(currentX > max_x)
        {
            series->removePoints(0,series->count() - max_x);
            axisX->setMin(currentX - max_x + 1);
        }
        currentX++;
    });
    timer->start(1000); // 每秒添加一个点

柱状图

//创建柱状图(Bar Chart)
    QBarSet *set0 = new QBarSet("数据A");
    QBarSet *set1 = new QBarSet("数据B");
    *set0 << 1 << 2 << 3 << 4 << 5;
    *set1 << 5 << 4 << 3 << 2 << 1;

    QBarSeries *seriesBar = new QBarSeries();
    seriesBar->append(set0);
    seriesBar->append(set1);

    QChart *chartBar = new QChart();
    chartBar->addSeries(seriesBar);
    chartBar->setTitle("柱状图示例");
    chartBar->setAnimationOptions(QChart::SeriesAnimations); // 启用动画

    // 设置分类轴
    QStringList categories {"Jan", "Feb", "Mar", "Apr", "May"};
    QBarCategoryAxis *axisXBar = new QBarCategoryAxis();
    axisXBar->append(categories);
    chartBar->addAxis(axisXBar, Qt::AlignBottom);
    seriesBar->attachAxis(axisXBar);

    // 显示
    // QChartView *chartViewBar = new QChartView(chart);
    // chartViewBar->show();
    ui->chartViewBar->setChart(chartBar);
    ui->chartViewBar->show();

饼状图

// 创建饼图系列
    QPieSeries *seriesPie = new QPieSeries();
    seriesPie->append("Apple", 30);   // 添加数据切片
    seriesPie->append("Banana", 20);
    seriesPie->append("Orange", 50);

    // 自定义切片样式(可选)
    for (QPieSlice *slice : seriesPie->slices()) {
        slice->setLabelVisible(true);              // 显示标签
        slice->setLabelColor(Qt::black);           // 标签颜色
        slice->setLabelPosition(QPieSlice::LabelOutside);  // 标签位置
    }

    // 创建图表并添加系列
    QChart *chartPie = new QChart();
    chartPie->addSeries(seriesPie);
    chartPie->setTitle("饼图标题");         // 图表标题
    chartPie->legend()->setVisible(true);             // 显示图例
    chartPie->legend()->setAlignment(Qt::AlignRight); // 图例位置

    // 显示图表
    ui->chartViewPie->setChart(chartPie);
    ui->chartViewPie->setRenderHint(QPainter::Antialiasing); // 抗锯齿

UI

引用

QT       += charts

完整代码

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
// 在头文件或源文件的最顶部定义宏
//#define QT_CHARTS_USE_NAMESPACE
#include <QtCharts>
#include <QtCharts/QChartView>
#include <QtCharts/QSplineSeries>
#include <QValueAxis>
#include <QMainWindow>

//QT_CHARTS_USE_NAMESPACE

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    void initChart();
    int qrand();
    int max_x = 30;
};
#endif // MAINWINDOW_H

cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCharts>
#include <QtCharts/QChartView>
#include <QtCharts/QSplineSeries>
#include <QValueAxis>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initChart();

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initChart()
{
    // 创建折线数据系列
    // 创建折线系列
    QLineSeries *series = new QLineSeries;
    // series->append(0, 6);
    // series->append(2, 4);
    // series->append(3, 8);

    // 创建图表并添加系列
    QChart *chart = new QChart;
    chart->addSeries(series);
    chart->setTitle("实时数据监控");
    chart->setAnimationOptions(QChart::SeriesAnimations); // 启用动画

    // 显式创建轴(Qt6 兼容)
    QValueAxis *axisX = new QValueAxis;
    QValueAxis *axisY = new QValueAxis;
    chart->addAxis(axisX, Qt::AlignBottom);
    chart->addAxis(axisY, Qt::AlignLeft);
    series->attachAxis(axisX);
    series->attachAxis(axisY);

    axisX->setTitleText("时间");
    axisY->setTitleText("数值");
    axisX->setRange(0, 10);//设置范围
    axisY->setRange(0, 100);

    // 将图表嵌入到 QChartView 中显示
    // QChartView *chartView = new QChartView(chart);
    // chartView->setRenderHint(QPainter::Antialiasing); // 抗锯齿
    // chartView->resize(800, 600);
    //this->setCentralWidget(chartView);
    //代码中绑定到布局
    //ui->verticalLayout->addWidget(chartView); // 添加到布局

    ui->chartViewLine->setChart(chart);
    ui->chartViewLine->setRenderHint(QPainter::Antialiasing); // 抗锯齿

    // 动态更新数据
    // 定时器动态追加数据
    QTimer *timer = new QTimer(this);
    QObject::connect(timer, &QTimer::timeout, [=]() {
        static int currentX = 0;// 当前数据点的 X 值
        //动态添加数据
        series->append(currentX, QRandomGenerator::global()->bounded(100));

        axisX->setMax(currentX); // 自动扩展 X 轴范围

        // 控制数据量不超过30个
        // if (series->count() > 30) {
        //     series->remove(0);  // 移除最旧的点
        // }
        // // 动态调整 X 轴范围,显示最近30个点
        // if (currentX >= 30) {
        //     axisX->setRange(currentX - 29, currentX);
        // } else {
        //     axisX->setRange(0, currentX);
        // }

        if(currentX > max_x)
        {
            series->removePoints(0,series->count() - max_x);
            axisX->setMin(currentX - max_x + 1);
        }
        currentX++;
    });
    timer->start(1000); // 每秒添加一个点

    //创建柱状图(Bar Chart)
    QBarSet *set0 = new QBarSet("数据A");
    QBarSet *set1 = new QBarSet("数据B");
    *set0 << 1 << 2 << 3 << 4 << 5;
    *set1 << 5 << 4 << 3 << 2 << 1;

    QBarSeries *seriesBar = new QBarSeries();
    seriesBar->append(set0);
    seriesBar->append(set1);

    QChart *chartBar = new QChart();
    chartBar->addSeries(seriesBar);
    chartBar->setTitle("柱状图示例");
    chartBar->setAnimationOptions(QChart::SeriesAnimations); // 启用动画

    // 设置分类轴
    QStringList categories {"Jan", "Feb", "Mar", "Apr", "May"};
    QBarCategoryAxis *axisXBar = new QBarCategoryAxis();
    axisXBar->append(categories);
    chartBar->addAxis(axisXBar, Qt::AlignBottom);
    seriesBar->attachAxis(axisXBar);

    // 显示
    // QChartView *chartViewBar = new QChartView(chart);
    // chartViewBar->show();
    ui->chartViewBar->setChart(chartBar);
    ui->chartViewBar->show();

    // 创建饼图系列
    QPieSeries *seriesPie = new QPieSeries();
    seriesPie->append("Apple", 30);   // 添加数据切片
    seriesPie->append("Banana", 20);
    seriesPie->append("Orange", 50);

    // 自定义切片样式(可选)
    for (QPieSlice *slice : seriesPie->slices()) {
        slice->setLabelVisible(true);              // 显示标签
        slice->setLabelColor(Qt::black);           // 标签颜色
        slice->setLabelPosition(QPieSlice::LabelOutside);  // 标签位置
    }

    // 创建图表并添加系列
    QChart *chartPie = new QChart();
    chartPie->addSeries(seriesPie);
    chartPie->setTitle("饼图标题");         // 图表标题
    chartPie->legend()->setVisible(true);             // 显示图例
    chartPie->legend()->setAlignment(Qt::AlignRight); // 图例位置

    // 显示图表
    ui->chartViewPie->setChart(chartPie);
    ui->chartViewPie->setRenderHint(QPainter::Antialiasing); // 抗锯齿
}

关键类说明

  1. QPieSeries

    • 用于管理饼图的所有切片(QPieSlice)。
    • 通过 append(name, value) 添加数据。
  2. QPieSlice

    • 控制单个切片的属性,如颜色、标签、突出显示等。
    • 常用方法:setLabelVisible()setColor()setExploded()(突出显示)。
  3. QChart

    • 管理图表布局、标题、图例等。
    • 通过 addSeries() 添加数据系列。
  4. QChartView

    • 用于显示图件的 Widget,支持抗锯齿渲染。

自定义样式

  • 修改颜色‌:

  • slice->setColor(QColor("#FF5733"));  // 设置切片颜色
    

    突出显示切片‌:

  • slice->setExploded(true);          // 使切片突出
    slice->setExplodeDistanceFactor(0.1);  // 突出距离
    

    在 Qt Charts 中,AnimationOption 是 QChart 类中用于控制图表动画效果的枚举类型,其具体定义如下:

  • 1. 枚举值说明

    AnimationOption 包含以下选项 ‌‌6‌:

  • NoAnimation
    禁用所有动画效果。
  • GridAxisAnimations
    启用坐标轴网格的动画(如缩放、平移时网格渐变效果)。
  • SeriesAnimations
    启用数据系列的动画(如饼图切片展开、折线图数据点渐变)。
  • AllAnimations
    启用全部动画效果(等同于 GridAxisAnimations | SeriesAnimations)。
  • 2. 组合使用

    AnimationOptions 是 QFlags<AnimationOption> 类型,支持通过位运算组合多个选项 ‌‌6‌。例如:

  • chart->setAnimationOptions(QChart::GridAxisAnimations | QChart::SeriesAnimations);
    

    3. 应用方法

    通过 QChart::setAnimationOptions() 方法设置动画效果 ‌‌4,6‌:

  • QChart *chart = new QChart();
    chart->setAnimationOptions(QChart::AllAnimations);  // 启用所有动画
    

    5. 相关配置

  • 动画时长‌:通过 QChart::setAnimationDuration() 调整动画时长(默认 1000ms)‌‌46‌。
  • 缓动曲线‌:通过 QChart::setAnimationEasingCurve() 设置动画缓动效果(如弹性、加速曲线)‌‌6‌。
  • 适用场景

  • 数据动态更新时(如实时折线图),建议启用 SeriesAnimations 提升视觉效果 ‌‌67‌。
  • 静态图表中可禁用动画(NoAnimation)以减少性能开销 ‌‌6‌。

相关文章:

  • 算法系列——有监督学习——5.支持向量机(核方法)
  • Eplan许可分析
  • flutter 专题 九十 四 Flutter开发之基础知识
  • 区间震荡指标
  • JavaWeb之WebSocket
  • Servlet、Servlet的5个接口方法、生命周期、以及模拟实现 HttpServlet 来写接口的基本原理
  • 加速还是安全?CDN与群联云防护的本质差异与适用场景
  • 闻所闻尽:穿透声音的寂静,照见生命的本真
  • 数据库主观题题库及答案
  • 力扣45.跳跃游戏
  • 【leetcode hot 100 39】组合总和
  • 查看GPU型号、大小;CPU型号、个数、核数、内存
  • Vue3 基础语法指南:响应式系统与 Ref 应用
  • JavaIO流的使用和修饰器模式(直击心灵版)
  • 1201. 【高精度练习】蜜蜂路线
  • vpc网络的原理
  • 【Android】基础架构(详细介绍)
  • HAL库定时器配置
  • 每日一题力扣3248.矩阵中的蛇c++
  • 第三章:单调队列
  • 美商界报告:全美超86万岗位依赖对华出口,关税将重创美国出口商
  • 证监会:坚决拥护党中央对王建军进行纪律审查和监察调查的决定
  • 国务院任免国家工作人员:颜清辉任人社部副部长
  • 央行4月开展12000亿元买断式逆回购操作
  • 十四届全国人大常委会第十五次会议在京闭幕
  • 奈雪的茶叫停“能喝奶茶就不要喝水”宣传,当地市监称不要误导消费者