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

news2025/3/22 21:06:58

效果

折线图

// 创建折线数据系列
    // 创建折线系列
    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‌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于vue框架的在线影院系统a079l(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,电影,电影类别,电影库 开题报告内容 基于Vue框架的在线影院系统开题报告 一、研究背景与意义 随着文化娱乐产业的蓬勃发展&#xff0c;电影院作为人们休闲消遣的重要场所&#xff0c;其管理效率和服务质量直接影响着顾客的观影体…

OpenCV图像拼接(1)概述

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 此图说明了在Stitcher类中实现的拼接模块流程。使用该类&#xff0c;可以配置/移除某些步骤&#xff0c;即根据特定需求调整拼接流程。流程中的所…

基于ssm学科竞赛小程序的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着信息时代的来临&#xff0c;过去的学科竞赛管理方式的缺点逐渐暴露&#xff0c;本次对过去的学科竞赛管理方式的缺点进行分析&#xff0c;采取计算机方式构建学科竞赛小程序。本文通过阅读相关文献&#xff0c;研究国内外相关技术&#xff0c;提出了一种关于竞赛信息…

[特殊字符][特殊字符][特殊字符][特殊字符][特殊字符][特殊字符]壁紙 流光染墨,碎影入梦

#Cosplay #&#x1f9da;‍♀️Bangni邦尼&#x1f430;. #&#x1f4f7; 穹妹 Set.01 #后期圈小程序 琼枝低垂&#xff0c;霜花浸透夜色&#xff0c;风起时&#xff0c;微光轻拂檐角&#xff0c;洒落一地星辉。远山隐于烟岚&#xff0c;唯余一抹青黛&#xff0c;勾勒出天光水…

虚拟机的三种 Linux 网络配置原理图解读

前言 虚拟机的网络连接方式主要有 三种模式&#xff1a;桥接模式&#xff08;Bridged&#xff09;、NAT 模式&#xff08;Network Address Translation&#xff09;、仅主机模式&#xff08;Host-Only&#xff09;。每种模式都有不同的使用场景和网络适应性&#xff0c;具体解释…

AI Agent系列(七) -思维链(Chain of Thought,CoT)

AI Agent系列【七】 前言一、CoT技术详解1.1 CoT组成1.2 CoT的特点 二、CoT的作用三、CoT的好处四、CoT适用场景五、CoT的推理结构 前言 思维链(Chain of Thought,CoT)&#xff0c;思维链就是一系列中间的推理步骤(a series of intermediate reasoning steps)&#xff0c;通过…

SpringBoot实现异步调用的方法

在Java中使用Spring Boot实现异步请求和异步调用是一个常见的需求&#xff0c;可以提高应用程序的性能和响应能力。以下是实现这两种异步操作的基本方法&#xff1a; 一、异步请求&#xff08;Asynchronous Request&#xff09; 异步请求允许客户端发送请求后立即返回&#x…

PurpleLlama大模型安全全套检测方案

1. 引入 PurpleLlama是Meta的大模型安全整体解决方案&#xff08;参考1&#xff09;&#xff0c;它包括了 &#xff08;1&#xff09;安全评估 CyberSecEval是一个用于评估大型语言模型&#xff08;LLMs&#xff09;安全风险的基准套件&#xff0c;其目标是解决随着 LLMs 的广…

vue el-table 设置selection选中状态

toggleRowSelection 方法 vue el-table 设置selection选中状态 关键代码 multipleTableRef.value!.toggleRowSelection(item, true);<el-table:data"data":border"setBorder"v-bind"$attrs"row-key"id"stripestyle"width: 1…

STM32学习笔记之常用总线(原理篇)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

【数据结构】栈(Stack)、队列(Queue)、双端队列(Deque) —— 有码有图有真相

目录 栈和队列 1. 栈&#xff08;Stack&#xff09; 1.1 概念 1.2 栈的使用&#xff08;原始方法&#xff09; 1.3 栈的模拟实现 【小结】 2. 栈的应用场景 1、改变元素的序列 2、将递归转化为循环 3、逆波兰表达式求值 4、括号匹配 5、出栈入栈次序匹配 6、最小栈…

OpenCV中的矩阵操作

OpenCV中的矩阵操作主要围绕Mat类展开&#xff0c;涵盖创建、访问、运算及变换等。 1. 创建矩阵 ‌零矩阵/单位矩阵‌&#xff1a; Mat zeros Mat::zeros(3, 3, CV_32F); // 3x3浮点零矩阵 Mat eye Mat::eye(3, 3, CV_32F); // 3x3单位矩阵 自定义初始化‌&#xff1a…

OAK相机入门(一):深度测距原理

文章目录 1. 测距参数介绍2. 测距原理3. 总结 官方文档 Configuring Stereo Depth 1. 测距参数介绍 理论范围&#xff1a;0.2-35m 推荐范文&#xff1a;不低于0.5m 存储类型&#xff1a;uint16&#xff0c;0代表没有数据&#xff0c;或者测不到 2. 测距原理 通过视差进行测距…

Powershell WSL .wslconfig 实现与宿主机的网络互通

前言.wslconfig .wslconfig 用于在 WSL 2 上运行的所有已安装发行版中配置全局设置 wsl 2 网络模式介绍 Bridged (外部): 桥接模式将虚拟机的网络连接直接桥接到物理网络适配器上Mirrored (镜像): 镜像模式并不是一个标准的 Hyper-V 网络类型,但它通常指的是在网络适配器级…

Vue:Vue2和Vue3创建项目的几种常用方式以及区别

前言 Vue.js 和 Element UI 都是用 JavaScript 编写的。 1、Vue.js 是一个渐进式 JavaScript 框架。2、Element UI 是基于 Vue.js 的组件库。3、JavaScript 是这两个项目的主要编程语言。 而Element Plus是基于TypeScript开发的。 一、Vue2 1、基于vuecli工具创建 vue2 …

IRF拆除

冗余口、冗余组、备份组、虚墙、MAD检测、被控制器纳管、转换为安全策略 黑洞路由的定义: 有来无回的路由。 对设备拆除IRF操作流程。 1、关闭主框的业务口&#xff08;对设备的接口使用shutdown&#xff09;&#xff0c;关闭MAD检测口&#xff08;BFD/NQA/MAD&#xff09;&…

强化学习(赵世钰版)-学习笔记(8.值函数方法)

本章是算法与方法的第四章&#xff0c;是TD算法的拓展&#xff0c;本质上是将状态值与行为值的表征方式&#xff0c;从离散的表格形式&#xff0c;拓展到了连续的函数形式。 表格形式的优点是直观&#xff0c;便于分析&#xff0c;缺点是数据量较大或者连续性状态或者行为空间时…

STM32F4与串口屏通信

淘晶池串口屏操作指令集 那我们就来谈一谈串口屏与STM32F4嵌入式板子的通信 第一&#xff0c;串口屏传输数据给F4板子 这时&#xff0c;我们就该来谈一谈prints函数和printh函数的用法 prints att,length att:变量名称 length:长度(0为自动长度) printh hex hex:需要发送的…

车载以太网网络测试-20【传输层-DOIP协议-3】

1 摘要 本文继续对ISO 13400-2定义的节点管理报文进行介绍&#xff0c;主要对路由激活请求/响应报文以及在线检查请求/响应报文的作用、帧结构以及示例进行介绍。 上文回顾&#xff1a; 车载以太网网络测试-19【传输层-DOIP协议-2】 在进行详细介绍之前&#xff0c;还是先回顾…

`chromadb` 是什么

chromadb 是什么 chromadb 是一个开源的向量数据库,它专门用于存储、索引和查询向量数据。在处理自然语言处理(NLP)、计算机视觉等领域的任务时,通常会将文本、图像等数据转换为向量表示,而 chromadb 可以高效地管理这些向量,帮助开发者快速找到与查询向量最相似的向量数…