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); // 抗锯齿
}
关键类说明
-
QPieSeries
- 用于管理饼图的所有切片(
QPieSlice)。 - 通过
append(name, value)添加数据。
- 用于管理饼图的所有切片(
-
QPieSlice
- 控制单个切片的属性,如颜色、标签、突出显示等。
- 常用方法:
setLabelVisible(),setColor(),setExploded()(突出显示)。
-
QChart
- 管理图表布局、标题、图例等。
- 通过
addSeries()添加数据系列。
-
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。
相关文章:
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->setTit…...
基于vue框架的在线影院系统a079l(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,电影,电影类别,电影库 开题报告内容 基于Vue框架的在线影院系统开题报告 一、研究背景与意义 随着文化娱乐产业的蓬勃发展,电影院作为人们休闲消遣的重要场所,其管理效率和服务质量直接影响着顾客的观影体…...
vscode/cursor中python运行路径设置 模块导入问题
vscode/cursor中python运行路径设置 ## 文件路径设置 问题描述 pycharm的项目用cursor运行,出现目录找不到 后来利用 os.getcwd(),经过打印调试发现是IDE的本身配置问题 pycharm中,os.getcwd()默认打开当前脚本所在目录 vscode/cursor中…...
OpenCV图像拼接(1)概述
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 此图说明了在Stitcher类中实现的拼接模块流程。使用该类,可以配置/移除某些步骤,即根据特定需求调整拼接流程。流程中的所…...
NFS 安装与测试
NFS 安装与测试 服务器 # NFS 共享目录 mkdir -p ${HOME}/Share/nfs && sudo chown -R nobody:nogroup ${HOME}/Share/nfs# 安装 NFS Server sudo apt install nfs-kernel-server# 配置 NFS 目录 sudo cp -arf /etc/exports /etc/exports.bak sudo tee -a /etc/exports…...
深度学习与传统算法在人脸识别领域的演进:从Eigenfaces到ArcFace
一、传统人脸识别方法的发展与局限 1.1 Eigenfaces:主成分分析的经典实践 算法原理 Eigenfaces是基于主成分分析(PCA)的里程碑式方法。其核心思想是将人脸图像视为高维向量,通过协方差矩阵计算特征向量(即特征脸&…...
基于ssm学科竞赛小程序的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着信息时代的来临,过去的学科竞赛管理方式的缺点逐渐暴露,本次对过去的学科竞赛管理方式的缺点进行分析,采取计算机方式构建学科竞赛小程序。本文通过阅读相关文献,研究国内外相关技术,提出了一种关于竞赛信息…...
【嵌入式学习】触发器 - ADC - DAC
# 触发器 基本概念:一种能够存储一位二进制信息的数字逻辑电路,其输出不仅取决于当前输入,还与之前的状态有关。 常见触发器类型: ①RS触发器:最基本的双稳态电路,包含两个输入(置位S和复位R&…...
[特殊字符][特殊字符][特殊字符][特殊字符][特殊字符][特殊字符]壁紙 流光染墨,碎影入梦
#Cosplay #🧚♀️Bangni邦尼🐰. #📷 穹妹 Set.01 #后期圈小程序 琼枝低垂,霜花浸透夜色,风起时,微光轻拂檐角,洒落一地星辉。远山隐于烟岚,唯余一抹青黛,勾勒出天光水…...
虚拟机的三种 Linux 网络配置原理图解读
前言 虚拟机的网络连接方式主要有 三种模式:桥接模式(Bridged)、NAT 模式(Network Address Translation)、仅主机模式(Host-Only)。每种模式都有不同的使用场景和网络适应性,具体解释…...
AI Agent系列(七) -思维链(Chain of Thought,CoT)
AI Agent系列【七】 前言一、CoT技术详解1.1 CoT组成1.2 CoT的特点 二、CoT的作用三、CoT的好处四、CoT适用场景五、CoT的推理结构 前言 思维链(Chain of Thought,CoT),思维链就是一系列中间的推理步骤(a series of intermediate reasoning steps),通过…...
SpringBoot实现异步调用的方法
在Java中使用Spring Boot实现异步请求和异步调用是一个常见的需求,可以提高应用程序的性能和响应能力。以下是实现这两种异步操作的基本方法: 一、异步请求(Asynchronous Request) 异步请求允许客户端发送请求后立即返回&#x…...
PurpleLlama大模型安全全套检测方案
1. 引入 PurpleLlama是Meta的大模型安全整体解决方案(参考1),它包括了 (1)安全评估 CyberSecEval是一个用于评估大型语言模型(LLMs)安全风险的基准套件,其目标是解决随着 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学习笔记之常用总线(原理篇)
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
【数据结构】栈(Stack)、队列(Queue)、双端队列(Deque) —— 有码有图有真相
目录 栈和队列 1. 栈(Stack) 1.1 概念 1.2 栈的使用(原始方法) 1.3 栈的模拟实现 【小结】 2. 栈的应用场景 1、改变元素的序列 2、将递归转化为循环 3、逆波兰表达式求值 4、括号匹配 5、出栈入栈次序匹配 6、最小栈…...
OpenCV中的矩阵操作
OpenCV中的矩阵操作主要围绕Mat类展开,涵盖创建、访问、运算及变换等。 1. 创建矩阵 零矩阵/单位矩阵: Mat zeros Mat::zeros(3, 3, CV_32F); // 3x3浮点零矩阵 Mat eye Mat::eye(3, 3, CV_32F); // 3x3单位矩阵 自定义初始化:…...
OAK相机入门(一):深度测距原理
文章目录 1. 测距参数介绍2. 测距原理3. 总结 官方文档 Configuring Stereo Depth 1. 测距参数介绍 理论范围:0.2-35m 推荐范文:不低于0.5m 存储类型:uint16,0代表没有数据,或者测不到 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、关闭主框的业务口(对设备的接口使用shutdown),关闭MAD检测口(BFD/NQA/MAD)&…...
SEV内存加密位linux内核设置过程
1. KVM_MEMORY_ENCRYPT_OP初始化 main() // QEMU 入口函数qemu_init() // 初始化虚拟机configure_acceleratorskvm_initsev_guest_initKVM_SEV_INITsev_launch_startKVM_SEV_LAUNCH_STARTram_block_notifier_add(&sev_ram_notifier); …...
强化学习(赵世钰版)-学习笔记(8.值函数方法)
本章是算法与方法的第四章,是TD算法的拓展,本质上是将状态值与行为值的表征方式,从离散的表格形式,拓展到了连续的函数形式。 表格形式的优点是直观,便于分析,缺点是数据量较大或者连续性状态或者行为空间时…...
C++编译汇编八股总结
汇编的四个阶段? 预编译(预处理): 预编译是源代码在编译之前进行的一些处理,主要包括宏定义展开、条件编译指令处理和头文件展开等。 编译: 编译器根据源代码的语法和语义规则,将源代码进行词法…...
STM32F4与串口屏通信
淘晶池串口屏操作指令集 那我们就来谈一谈串口屏与STM32F4嵌入式板子的通信 第一,串口屏传输数据给F4板子 这时,我们就该来谈一谈prints函数和printh函数的用法 prints att,length att:变量名称 length:长度(0为自动长度) printh hex hex:需要发送的…...
车载以太网网络测试-20【传输层-DOIP协议-3】
1 摘要 本文继续对ISO 13400-2定义的节点管理报文进行介绍,主要对路由激活请求/响应报文以及在线检查请求/响应报文的作用、帧结构以及示例进行介绍。 上文回顾: 车载以太网网络测试-19【传输层-DOIP协议-2】 在进行详细介绍之前,还是先回顾…...
`chromadb` 是什么
chromadb 是什么 chromadb 是一个开源的向量数据库,它专门用于存储、索引和查询向量数据。在处理自然语言处理(NLP)、计算机视觉等领域的任务时,通常会将文本、图像等数据转换为向量表示,而 chromadb 可以高效地管理这些向量,帮助开发者快速找到与查询向量最相似的向量数…...
基于深度学习的运动想象脑电信号分类研究
标题:基于深度学习的运动想象脑电信号分类研究 内容:1.摘要 背景:运动想象脑电信号分类在康复医学、人机交互等领域具有重要应用价值,但传统方法在处理复杂脑电信号时存在一定局限性。目的:本研究旨在探索基于深度学习的方法对运动想象脑电信…...
HTML5 Video标签详细教程
HTML5 Video标签详细教程 简介 HTML5引入的<video>标签为网页提供了原生视频播放功能,无需依赖Flash等第三方插件。它使得在网页中嵌入和控制视频内容变得简单而强大。本教程将详细介绍<video>标签的使用方法、属性、事件以及相关技术。 基本用法 最…...
【Hbase】查看所有表
在 HBase 中,查看所有表时,通常不需要指定命名空间,除非有特殊需求或配置。以下是一些具体情况: 默认情况下 • HBase Shell:使用list命令时,默认会列出所有命名空间中的所有表,而不仅仅是默认…...
