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

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.xdnf.cn/news/19657.html

相关文章:

  • 【学Python自动化】 7.1 Python 与 Rust 输入输出对比学习笔记
  • Linux系统shell脚本(二)
  • 【Python - 基础 - 工具】解决pycharm“No Python interpreter configured for the project”问题
  • 机器学习入门,支持向量机
  • Vite + React + Tailwind v4 正确配置指南(避免掉进 v3 的老坑)
  • 为什么程序员总是发现不了自己的Bug?
  • Flutter 3.35.2 主题颜色设置指南
  • 使用 qmake 生成 Makefile,Makefile 转换为 Qt 的 .pro 文件
  • Redis核心数据类型解析——string篇
  • 基于YOLO8的番茄成熟度检测系统(数据集+源码+文章)
  • 2025年女性最实用的IT行业证书推荐:赋能职业发展的8大选择
  • Elasticsearch面试精讲 Day 5:倒排索引原理与实现
  • IoTDB对比传统数据库的五大核心优势
  • 深度估计:单目视觉实现车距测量和车速估计(含完整项目代码)
  • ubantu20.04 git clone 无法连接问题与解决方法
  • netstat用法
  • 别再让分散 IO 拖慢性能!struct iovec:高效处理聚集 IO 的底层利器
  • pikachu之 unsafe upfileupload (不安全的文件上传漏洞)
  • 力扣hot100:除自身以外数组的乘积(除法思路和左右前缀乘积)(238)
  • 毕业项目推荐:70-基于yolov8/yolov5/yolo11的苹果成熟度检测识别系统(Python+卷积神经网络)
  • 【无人机三维路径规划】基于遗传算法GA结合粒子群算法PSO无人机复杂环境避障三维路径规划(含GA和PSO对比)研究
  • 基于单片机醉酒驾驶检测系统/酒精检测/防疲劳驾驶设计
  • 基于单片机雏鸡孵化恒温系统/孵化环境检测系统设计
  • WPF启动窗体的三种方式
  • 【Day 42】Shell-expect和sed
  • 【python】lambda函数
  • Ubuntu 24.04 服务器配置MySQL 8.0.42 三节点集群(一主两从架构)安装部署配置教程
  • ubuntu部署MySQL服务
  • 数据结构——树(04二叉树,二叉搜索树专项,代码练习)
  • 【硬核干货】把 DolphinScheduler 搬进 K8s:奇虎 360 商业化 900 天踩坑全记录