ChartView的基本使用

         Qt ChartView(准确类名 QChartView)是 Qt Charts 模块里最常用的图表显示控件。一句话概括:“它把 QChart 画出来,并自带缩放、平移、抗锯齿等交互能力”。

        QML ChartView 简介(一句话先记住:ChartView 是 QML 场景里用来“装”各种图表的容器

一、ChartView的基本知识

  • 类型:ChartView(QtQuick 2.x 场景里的标准 Item)

  • 模块:import QtCharts 2.15(或 2.3/2.5/2.12 视 Qt 版本而定)

  • 作用:把 Qt Charts 的所有图表(折线、柱状、饼图、面积、散点、极坐标……)直接渲染到 QML 界面,并自带动画、缩放、交互、主题等功能

最小可运行代码,运行即可看到带标题、动画过渡的折线图

QT += core gui widgets charts qml quick
#include <QApplication>
#include <QGuiApplication>
#include <QQmlApplicationEngine>int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQApplication app(argc, argv);QQmlApplicationEngine engine;const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}
import QtQuick          2.15
import QtQuick.Window   2.15
import QtCharts         2.15Window {visible: truewidth: 640; height: 480title: qsTr("ChartView 最小示例")ChartView {anchors.fill: parenttitle: "温度"LineSeries {name: "T"XYPoint { x: 0; y: 20 }XYPoint { x: 1; y: 25 }XYPoint { x: 2; y: 23 }}}
}

关键属性速查

功能常用属性示例值
图表标题title / titleColor / titleFont"销售额"
外观主题themeChartView.ChartThemeDark
动画animationOptionsChartView.SeriesAnimations
背景backgroundColor / backgroundRoundness"#1e1e1e"
图例legend.visible / legend.alignmentfalse / Qt.AlignBottom
边距margins.top / margins.left …10
缩放zoomIn() / zoomOut() / resetZoom()方法调用
鼠标交互内部自带 MouseArea 或自定义

数据绑定与动态更新

方案 A:在 纯 QML 里用 Timer 定时追加数据

import QtQuick          2.15
import QtQuick.Window   2.15
import QtCharts         2.15Window {visible: truewidth: 640; height: 480title: qsTr("ChartView 实时刷新")ChartView {id: chartanchors.fill: parenttitle: "温度"animationOptions: ChartView.SeriesAnimations   // 开启动画// X、Y 轴ValueAxis {id: axisXmin: 0max: 10            // 初始横轴 10 个点titleText: "采样次数"}ValueAxis {id: axisYmin: 15max: 35titleText: "温度 (°C)"}LineSeries {id: seriesname: "T"axisX: axisXaxisY: axisY}}/* ---------- 定时刷新 ---------- */Timer {interval: 800          // 800 ms 一次running: truerepeat: trueonTriggered: {const x = series.count          // 当前点数const y = 20 + Math.random()*10 // 模拟 20~30 °Cseries.append(x, y)// 简单的滚动窗口:超过 10 个点就整体右移if (x > 10) {axisX.min += 1axisX.max += 1}}}
}

方案 B:在 C++ 里用信号触发刷新
(适合真正的大数据/硬件采集,UI 不卡顿)

#ifndef DATASOURCE_H
#define DATASOURCE_H#include <QObject>
#include <QTimer>
#include <QRandomGenerator>// dataSource.h
class DataSource : public QObject {Q_OBJECT
public:explicit DataSource(QObject *parent = nullptr) : QObject(parent) {m_timer.setInterval(500);connect(&m_timer, &QTimer::timeout, this, &DataSource::generate);m_timer.start();}signals:void newPoint(qreal x, qreal y);private:void generate() {static int i = 0;emit newPoint(i++, 20 + QRandomGenerator::global()->generateDouble()*10);}QTimer m_timer;
};#endif // DATASOURCE_H
#include <QApplication>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>#include <DataSource.h>int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQApplication app(argc, argv);QQmlApplicationEngine engine;DataSource src;engine.rootContext()->setContextProperty("dataSrc", &src);const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}
import QtQuick          2.15
import QtQuick.Window   2.15
import QtCharts         2.15Window {visible: truewidth: 640; height: 480title: qsTr("ChartView 实时刷新")ChartView {id: chartanchors.fill: parenttitle: "温度"animationOptions: ChartView.SeriesAnimations   // 开启动画// X、Y 轴ValueAxis {id: axisXmin: 0max: 10            // 初始横轴 10 个点titleText: "采样次数"}ValueAxis {id: axisYmin: 15max: 35titleText: "温度 (°C)"}LineSeries {id: seriesname: "T"axisX: axisXaxisY: axisY}}Connections {target: dataSrcfunction onNewPoint(x, y) {series.append(x, y);if (x > 10) {axisX.min += 1;axisX.max += 1;}}}
}

常用系列类型

  • LineSeries 折线

  • SplineSeries 平滑曲线

  • AreaSeries 面积

  • ScatterSeries 散点

  • BarSeries / StackedBarSeries 柱状

  • PieSeries 饼图

  • PolarChartView 极坐标图(继承自 ChartView 的特化)

坐标轴

ChartView 不会自动创建轴,需要手动声明并绑定:

ValueAxis {id: axisXmin: 0; max: 10tickCount: 6
}
ValueAxis {id: axisYmin: 0; max: 100
}
LineSeries {axisX: axisXaxisY: axisY
}

大数据刷新

在大数据量(场景下,ChartView 的动画、抗锯齿、OpenGL 加速等设置都会影响性能。

  1. 真·实时刷新 超过几万点后,append() 会开始卡顿。
    建议:
    • 使用 replace() 替换整条数组,而不是逐点 append()
    • 或者自己实现降采样(只保留最新 N 点)。

  2. Qt 版本差异
    useOpenGL 在 Qt 6 已经废弃,Qt 6 默认就是 GPU 管线,无需设置。
    • 若用 Qt 6,只需 animationOptions: ChartView.NoAnimation 即可。

import QtQuick          2.15
import QtQuick.Window   2.15
import QtCharts         2.15Window {visible: truewidth: 800; height: 500title: qsTr("大数据折线图,需等待")ChartView {id: chartanchors.fill: parenttitle: "温度曲线"animationOptions: ChartView.NoAnimation   // 关动画antialiasing: false                       // 关抗锯齿ValueAxis { id: axisX; min: 0; max: 10000 }ValueAxis { id: axisY; min: 15; max: 35 }LineSeries {id: seriesaxisX: axisXaxisY: axisYuseOpenGL: true   // 用 GPU}}Component.onCompleted: {for (let i = 0; i < 10000; ++i)series.append(i, 20 + Math.sin(i * 0.01) * 5);}
}
设置作用备注
animationOptions: ChartView.NoAnimation彻底关闭系列动画,减少 CPU/GPU 负载大数据必备
antialiasing: false关闭边缘平滑,每帧少一次全屏混合视觉略差,性能提升明显
renderTarget: ChartView.GL让 ChartView 整体用 OpenGL 渲染Qt 5.11+ 支持
LineSeries.useOpenGL: true把折线交给 GPU 画必须 与上一条一起用

        QML ChartView = “在 QML 里拖一个矩形就能画出任何 Qt Charts 图表” —— 剩下的只是配置系列、坐标轴和样式。

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

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

相关文章

系统扩展策略

1、核心指导思想&#xff1a;扩展立方体 在讨论具体策略前&#xff0c;先了解著名的扩展立方体&#xff08;Scale Cube&#xff09;&#xff0c;它定义了三种扩展维度&#xff1a; X轴&#xff1a;水平复制&#xff08;克隆&#xff09; 策略&#xff1a;通过负载均衡器&#…

HBuilder X 4.76 开发微信小程序集成 uview-plus

简介 本文记录了在HBuilder中创建并配置uni-app项目的完整流程。 首先创建项目并测试运行&#xff0c;确认无报错后添加uView-Plus组件库。 随后修改了main.js、uni.scss、App.vue等核心文件&#xff0c;配置manifest.json并安装dayjs、clipboard等依赖库。 通过调整vite.c…

第4章:内存分析与堆转储

本章概述内存分析是 Java 应用性能调优的核心环节之一。本章将深入探讨如何使用 VisualVM 进行内存分析&#xff0c;包括堆内存监控、堆转储生成与分析、内存泄漏检测以及内存优化策略。通过本章的学习&#xff0c;你将掌握识别和解决内存相关问题的专业技能。学习目标理解 Jav…

面经分享一:分布式环境下的事务难题:理论边界、实现路径与选型逻辑

一、什么是分布式事务? 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。 一个典型的例子就是跨行转账: 用户从银行A的账户向银行B的账户转账100元。 这个操作包含两个步骤: 从A账户扣减100元。 向B账户…

C++的演化历史

C是一门这样的编程语言&#xff1a; 兼顾底层计算机硬件系统和高层应用抽象机制从实际问题出发&#xff0c;注重零成本抽象、性能、可移植性、与C兼容语言特性和细节很多&#xff0c;学习成本较高&#xff0c;是一门让程序员很难敢说精通的语言 C是自由的&#xff0c;支持5种…

Qt6实现绘图工具:12种绘图工具全家桶!这个项目满足全部2D场景

项目概述 一个基于Qt框架开发的专业绘图工具,实现了完整的2D图形绘制、编辑和管理功能。该项目采用模块化设计,包含图形绘制、图层管理、命令模式撤销重做、用户界面等多个子系统,是学习现代C++和Qt框架的最佳实践。 核心功能特性 12种专业绘图工具 多图层绘制系统 完整的…

Linux驱动开发学习笔记

第1章 Linux驱动开发的方式mmap映射型设计方法。【不推荐】将芯片上的物理地址映射到用户空间的虚拟地址上&#xff0c;用户操作虚拟地址来操作硬件。使用文件操作集(file_operatiopns)设计方法。【极致推荐】platfrom总线型设置方法。【比较流行】设备树。【推荐】第2章 Linux…

mac中进行适用于IOS的静态库构建

前沿: 进行C开发完成之后,需要将代码编译成静态库,并且在IOS的手机系统中执行,因此记录该实现过程. 1主要涉及内容 1.1 整体文件架构 gongyonglocalhost Attention % tree -L 2 . ├── build │ ├── __.SYMDEF │ ├── cmake_install.cmake │ ├── CMakeCache…

C++二维数组的前缀和

C二维数组的前缀和的方法很简单&#xff0c;可以利用公式res[i][j]arr[i][j]res[i-1][j]prefix[i][j-1]-res[i-1][j-1]。输入4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16输出1 3 6 10 6 14 24 36 15 33 54 78 28 60 96 136#include<bits/stdc.h> using namespace std; int…

Wifi开发上层学习1:实现一个wifi搜索以及打开的app

Wifi开发上层学习1&#xff1a;实现一个wifi搜索以及打开的app 文章目录Wifi开发上层学习1&#xff1a;实现一个wifi搜索以及打开的app背景demo实现1.添加系统权限以及系统签名2.布局配置3.逻辑设计3.1 wifi开关的实现3.2 wifi扫描功能3.3 连接wifi总结一、WiFi 状态控制接口二…

【DSP28335 入门教程】定时器中断:为你的系统注入精准的“心跳”

大家好&#xff0c;欢迎来到 DSP28335 的核心精讲系列。我们已经掌握了如何通过外部中断来响应“外部事件”&#xff0c;但系统内部同样需要一个精准的节拍器来处理“内部周期性任务”。单纯依靠 DELAY_US() 这样的软件延时&#xff0c;不仅精度差&#xff0c;而且会在延时期间…

从零开始:用代码解析区块链的核心工作原理

区块链技术被誉为信任的机器&#xff0c;它正在重塑金融、供应链、数字身份等众多领域。但对于许多开发者来说&#xff0c;它仍然像一个神秘的黑盒子。今天&#xff0c;我们将抛开炒作的泡沫&#xff0c;深入技术本质&#xff0c;用大约100行Python代码构建一个简易的区块链&am…

网络通信IP细节

目录 1.通信的NAT技术 2.代理服务器 3.内网穿透和内网打洞 1.通信的NAT技术 NAT技术产生的背景是我们为了解决IPV4不够用的问题&#xff0c;NAT在通信的时候可以对IP将私网IP转化为公网IP&#xff0c;全局IP要求唯一&#xff0c;但是私人IP不是唯一的。 将报文发给路由器进行…

国内真实的交换机、路由器和分组情况

一、未考虑拥挤情况理想状态的网络通信 前面我对骨干网&#xff1a; 宜春城区SDH网图分析-CSDN博客 数据链路层MAC传输&#xff1a; 无线通信网卡底层原理&#xff08;Inter Wi-Fi AX201&#xff09;_ax201ngw是cnvio转pci-e-CSDN博客 物理层、数据链路层、网络层及传输层…

atomic常用类方法

Java中的java.util.concurrent.atomic包提供了多种原子操作工具类&#xff0c;以下是核心类及其方法&#xff1a;‌1. AtomicBoolean‌‌方法‌&#xff1a;get()&#xff1a;获取当前值set(boolean newValue)&#xff1a;强制设置值compareAndSet(boolean expect, boolean upd…

算法题打卡力扣第3题:无重复字符的最长子串(mid)

文章目录题目描述解法一&#xff1a;暴力解解法二&#xff1a;滑动窗口题目描述 解法一&#xff1a;暴力解 遍历每一个可能的子串&#xff0c;然后逐一判断每个子串中是否有重复字符。 具体步骤&#xff1a; 使用两层嵌套循环来生成所有子串的起止位置&#xff1a; 外层循环 i…

HTML5 简介和基础骨架

一、HTML5 简介HTML5 是 HTML&#xff08;超文本标记语言&#xff09;的第五个主要版本&#xff0c;于 2014 年 10 月由 W3C&#xff08;万维网联盟&#xff09;正式发布。它不仅是对 HTML4.01 和 XHTML 的升级&#xff0c;更是一套完整的 Web 技术标准&#xff0c;包含了新的标…

.NET技术深度解析:现代企业级开发指南

每日激励&#xff1a; “不要一直责怪过去的自己&#xff0c;他曾经站在雾里也很迷茫” &#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1…

苹果手机文本转音频,自行制作背诵素材

当你在学习一段专业内容或者背诵重要知识点时&#xff0c;是不是有时会觉得眼睛看久了疲惫&#xff0c;而且记忆效果也不太理想呢&#xff1f;利用手头的苹果手机或iPad&#xff0c;你可以轻松将文本内容生成音频文件&#xff0c;然后随时随地反复听&#xff0c;这对于备考人士…

电子电子技术知识------MOSFET管

电子电子技术知识------MOSFET管前言一、结构与符号二、工作原理1.小功率MOSFET&#xff08;横向导电&#xff09;2.电力MOS管三、基本特性总结前言 MOSFET是电力场效应晶体管的英文简写&#xff0c;又称功率mos管&#xff0c;mos管 一、结构与符号 二、工作原理 1.小功率M…