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_NAMESPACEQT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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.mzph.cn/news/898847.shtml

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

相关文章

vector和list的区别是什么

vector 和 list 都是C 标准模板库&#xff08;STL&#xff09;中的容器&#xff0c;它们的区别如下&#xff1a; 内存结构 - vector &#xff1a;是连续的内存空间&#xff0c;就像数组一样&#xff0c;元素在内存中依次排列。 - list &#xff1a;是由节点组成的双向链表…

【AI】【AIGC】降低AIGC检测率:技术、挑战与应对策略

引言 随着生成式人工智能&#xff08;AIGC&#xff09;技术的迅速发展&#xff0c;越来越多的内容开始由人工智能生成。AIGC技术的应用非常广泛&#xff0c;包括文本生成、图像生成、音频生成等。然而&#xff0c;随着这些技术的普及&#xff0c;如何有效识别并检测AIGC生成的…

vue3 ts 请求封装后端接口

一 首页-广告区域-小程序 首页-广告区域-小程序 GET/home/banner1.1 请求封装 首页-广告区域 home.ts export const getHomeBannerApi (distributionSite 1) > {return http<BannerItem[]>({method: GET,url: /home/banner,data: {distributionSite,},}) }函数定…

响应式CMS架构优化SEO与用户体验

内容概要 在数字化内容生态中&#xff0c;响应式CMS架构已成为平衡搜索引擎可见性与终端用户体验的核心载体。该系统通过多终端适配技术&#xff0c;确保PC、移动端及平板等设备的内容渲染一致性&#xff0c;直接降低页面跳出率并延长用户停留时长。与此同时&#xff0c;智能S…

算法基础篇(1)(蓝桥杯常考点)

算法基础篇 前言 算法内容还有搜索&#xff0c;数据结构&#xff08;进阶&#xff09;&#xff0c;动态规划和图论 数学那个的话大家也知道比较难&#xff0c;放在最后讲 这期包含的内容可以看目录 模拟那个算法的话就是题说什么写什么&#xff0c;就不再分入目录中了 注意事…

MyBatis一级缓存和二级缓存

介绍 在开发基于 MyBatis 的应用时&#xff0c;缓存是提升性能的关键因素之一。MyBatis 提供了一级缓存和二级缓存&#xff0c;合理使用它们可以显著减少数据库的访问次数&#xff0c;提高系统的响应速度和吞吐量。本文将深入探讨 MyBatis 一级缓存和二级缓存的工作原理、使用…

C++核心语法快速整理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要为学过多门语言玩家快速入门C 没有基础的就放弃吧。 全部都是精华&#xff0c;看完能直接上手改别人的项目。 输出内容 std::代表了这里的cout使用的标准库&#xff0c;避免不同库中的相同命名导致混乱 …

如何让自动驾驶汽车“看清”世界?坐标映射与数据融合概述

在自动驾驶领域,多传感器融合技术是实现车辆环境感知和决策控制的关键。其中,坐标系映射和对应是多传感器融合的重要环节,它涉及到不同传感器数据在统一坐标系下的转换和匹配,以实现对车辆周围环境的准确感知。本文将介绍多传感器融合中坐标系映射和对应的数学基础和实际应…

Unity Shader 的编程流程和结构

Unity Shader 的编程流程和结构 Unity Shader 的编程主要由以下三个核心部分组成&#xff1a;Properties&#xff08;属性&#xff09;、SubShader&#xff08;子着色器&#xff09; 和 Fallback&#xff08;回退&#xff09;。下面是它们的具体作用和结构&#xff1a; 1. Pr…

第十四天- 排序

一、排序的基本概念 排序是计算机科学中一项重要的操作&#xff0c;它将一组数据元素按照特定的顺序&#xff08;如升序或降序&#xff09;重新排列。排序算法的性能通常通过时间复杂度和空间复杂度来衡量。在 Python 中&#xff0c;有内置的排序函数&#xff0c;同时也可以手…

移除idea External Liraries 中maven依赖包

问题背景 扩展包里面不停的出现已经在POM文件注释的包&#xff0c;其实是没有查询到根源位置。 在IDEA插件中搜索Maven Helper 点击pom.xml文件 会出现扩展插件 定位之后在pom中添加exclusions&#xff0c;如下代码 <dependency><groupId>com.disney.eva.framewo…

AI革命!蓝耘携手海螺AI视频,打造智能化视频新纪元

AI革命&#xff01;蓝耘携手海螺AI视频&#xff0c;打造智能化视频新纪元 前言 在这个信息爆炸的时代&#xff0c;视频已经成为我们获取信息、学习新知识的重要方式。而随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI与视频内容的结合为我们带来了全新的…

dify1.1.1安装

1、 按照GitHub上操作 下载源码&#xff0c;没有安装git的&#xff0c;可以下载成zip包&#xff0c; unzip 解压 git clone https://github.com/langgenius/dify.git cd dify cd docker cp .env.example .env2、启动前 &#xff0c;先改下 docker-compose.yaml&#xff0c;…

ElasticSearch 可观测性最佳实践

ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理 PB 级别&#xff08;大数据时代&#xff09;的数据。ES 也使用 Java 开…

Excel处理控件Spire.XLS系列教程:C# 在 Excel 中添加或删除单元格边框

单元格边框是指在单元格或单元格区域周围添加的线条。它们可用于不同的目的&#xff0c;如分隔工作表中的部分、吸引读者注意重要的单元格或使工作表看起来更美观。本文将介绍如何使用 Spire.XLS for .NET 在 C# 中添加或删除 Excel 单元格边框。 安装 Spire.XLS for .NET E-…

前端Wind CSS面试题及参考答案

目录 标准盒模型与 IE 盒模型的区别是什么?如何通过 box-sizing 属性切换这两种盒模型? 如何计算一个元素在标准盒模型下的总宽度(包含 margin、padding、border)? 父元素高度塌陷的原因是什么?请列举至少 3 种清除浮动的方法。 方法一:使用 clear 属性 方法二:使用…

基于 ECharts 实现动态图表渲染支持10万+数据点实时更新方案

引言 实现支持10万数据点实时更新的动态图表渲染确实具有挑战性&#xff0c;尤其是在性能和用户体验方面。以下是一些关键点和应用场景&#xff1a; 关键挑战 性能优化&#xff1a; 渲染性能&#xff1a;大量数据点会导致浏览器渲染压力大&#xff0c;可能引发卡顿。数据处理…

装饰器模式 (Decorator Pattern)

装饰器模式 (Decorator Pattern) 是一种结构型设计模式,它动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。 一、基础 1 意图 动态地给一个对象添加一些额外的职责。 就增加功能来说,装饰器模式相比生成子类更为灵活。 2 适用场景 当…

【Java】TCP网络编程:从可靠传输到Socket实战

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

蓝桥杯C++基础算法-0-1背包

这段代码实现了一个经典的0-1 背包问题的动态规划解法。0-1 背包问题是指给定一组物品&#xff0c;每个物品有其体积和价值&#xff0c;要求在不超过背包容量的情况下&#xff0c;选择物品使得总价值最大。以下是代码的详细思路解析&#xff1a; 1. 问题背景 给定 n 个物品&am…