QT(图表)

目录

QChart的继承关系

基本组件和概念

常见图表类型及其系列类

常用的图表配置

一、折线图示例

二、柱状图示例

三、饼图示例

四、类波形图(折线图)示例


QChart 模块提供了直观的图表绘制接口,支持创建各种常见的图表类型,如柱状图、折线图、饼图等。QChart主要应用于数据可视化,使得用户可以快速展示和分析数据。

QChart的继承关系

基本组件和概念

Qt Charts 模块中,常用的类包括:
QChart:图表的主体类,用于管理和显示各种图表系列。
QChartViewQWidget 的子类,用于将 QChart 显示在窗口上。
QSeries:每种图表类型都有相应的系列类,比如 QLineSeriesQBarSeriesQPieSeries 等,用于添加和管理特定类型的数据。

  • 要想在项目里使用 Qt Charts 模块,需要在 pro 文件下添加以下语句。
QT += charts
  • 如果我们点击查看 Qt Charts 类,我们可以看到要想使用 Qt Charts 类,除了需要包括相应的头文件外,还需要使用命名空间。格式如下。
  • 一般在头文件处加上这个。
QT_CHARTS_USE_NAMESPACE
  • 或者在头文件类外加上以下语句。
using namespace QtCharts;

常见图表类型及其系列类

  1. 折线图(Line Chart):使用 QLineSeries 类。

  2. 柱状图(Bar Chart):使用 QBarSeriesQBarSet 等类。

  3. 饼图(Pie Chart):使用 QPieSeries

  4. 散点图(Scatter Chart):使用 QScatterSeries

  5. 面积图(Area Chart):使用 QAreaSeries

常用的图表配置

1. 设置轴

  • 可以使用 QValueAxis 或 QCategoryAxis 自定义坐标轴。
#include <QtCharts/QValueAxis>

QValueAxis *axisX = new QValueAxis();
axisX->setRange(0, 10);
axisX->setTitleText("X Axis");

QValueAxis *axisY = new QValueAxis();
axisY->setRange(0, 10);
axisY->setTitleText("Y Axis");

chart->setAxisX(axisX, lineSeries);
chart->setAxisY(axisY, lineSeries);

2. 设置图例

chart->legend()->setVisible(true);
chart->legend()->setAlignment(Qt::AlignBottom);

3. 图表样式

  • 可以调整颜色、线条、字体等。
lineSeries->setColor(Qt::blue);
chart->setTitleFont(QFont("Arial", 14, QFont::Bold));

一、折线图示例

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QChartView>
#include <QLineSeries>

// 必需添加命名空间
QT_CHARTS_USE_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    QLineSeries *splineSeries;
    QChart *chart;
    QChartView *chartView;
};
#endif // MAINWINDOW_H

mainwindow.c

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setGeometry(0, 0, 800, 480);
    splineSeries = new QLineSeries();

    // 添加坐标点
    splineSeries->append(0, 6);
    splineSeries->append(2, 4);
    splineSeries->append(3, 8);
    splineSeries->append(7, 4);
    splineSeries->append(10, 5);

    chart = new QChart();
    chart->addSeries(splineSeries);
    chart->setTitle("Simple Line Chart Example");
    chart->createDefaultAxes(); //自动生成默认坐标轴

    chartView = new QChartView(chart);
    chartView->setChart(chart); // 将图表的内容设置在图表视图上
    chartView->setRenderHint(QPainter::Antialiasing); // 设置抗锯齿

    setCentralWidget(chartView); // 设置为图表视图为中心部件
}

MainWindow::~MainWindow() {
}

运行效果:

二、柱状图示例

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QBarSeries>
#include <QBarSet>
#include <QChartView>

// 必需添加命名空间
QT_CHARTS_USE_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    QBarSet  *set0;
    QBarSet  *set1;
    QBarSeries *barSeries;
    QChart *chart;
    QChartView *chartView;
};
#endif // MAINWINDOW_H

mainwindow.c

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setGeometry(0, 0, 800, 480);
    set0 = new QBarSet("Jane");
    set1 = new QBarSet("John");

    // 向容器中追加元素
    *set0 << 1 << 2 << 3 << 4 << 5 << 6;
    *set1 << 5 << 0 << 0 << 4 << 0 << 7;

    barSeries = new QBarSeries();
    barSeries->append(set0);
    barSeries->append(set1);

    chart = new QChart();
    chart->addSeries(barSeries);
    chart->setTitle("Simple Bar Chart Example");
    chart->setAnimationOptions(QChart::SeriesAnimations); // 增加动画效果,使数据加载、更新时有更流畅的过渡

    chartView = new QChartView(chart);
    chartView->setChart(chart); // 将图表的内容设置在图表视图上
    chartView->setRenderHint(QPainter::Antialiasing); // 设置抗锯齿

    setCentralWidget(chartView); // 设置为图表视图为中心部件
}

MainWindow::~MainWindow()
{
}

<< 操作符将一系列整数添加到两个集合或容器对象中,可能用于表示数据序列或某种集合操作。这种语法通常用于 QSetQVectorQList 等 Qt 容器类型。

运行效果:

三、饼图示例

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QChartView>
#include <QPieSeries>

// 必需添加命名空间
QT_CHARTS_USE_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    QPieSeries *pieSeries;
    QChart *chart;
    QChartView *chartView;
};
#endif // MAINWINDOW_H

mainwindow.c

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setGeometry(0, 0, 800, 480);
    pieSeries = new QPieSeries();
    pieSeries->append("Apple", 10);
    pieSeries->append("Banana", 20);
    pieSeries->append("Cherry", 30);
    pieSeries->append("Date", 40);

    chart = new QChart();
    chart->addSeries(pieSeries);
    chart->setTitle("Simple Pie Chart Example");

    chartView = new QChartView(chart);
    chartView->setChart(chart); // 将图表的内容设置在图表视图上
    chartView->setRenderHint(QPainter::Antialiasing); // 设置抗锯齿

    setCentralWidget(chartView); // 设置为图表视图为中心部件
}

MainWindow::~MainWindow()
{
}

运行效果:

四、类波形图(折线图)示例

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QChartView>
#include <QSplineSeries>
#include <QDebug>
#include <QValueAxis>
#include <QTimer>
#include <QMainWindow>

// 必需添加命名空间
QT_CHARTS_USE_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void receivedData(int);
    int maxSize;
    int maxX;
    int maxY;
    QValueAxis *axisY;
    QValueAxis *axisX;
    QList<int> data;
    QSplineSeries *splineSeries;
    QChart *chart;
    QChartView *chartView;
    QTimer *timer;

private slots:
    void timerTimeOut();
};
#endif // MAINWINDOW_H

mainwindow.c

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setGeometry(0, 0, 800, 480);
    maxSize = 51; // 最大储存maxSize - 1个数据
    maxX = 5000; // x轴上的最大值
    maxY = 40; // y轴上的最大值
    splineSeries = new QSplineSeries(); // splineSeries曲线实例化(折线用QLineSeries)
    chart = new QChart(); // 图表实例化
    chartView = new QChartView(); // 图表视图实例化

    // 坐标轴
    axisY = new QValueAxis();
    axisX = new QValueAxis();

    // 定时器
    timer = new QTimer(this);

    chart->legend()->hide(); /* legend译图例类型,以绘图的颜色区分,本例设置为隐藏 */
    chart->setTitle("实时动态曲线示例"); // chart设置标题
    chart->addSeries(splineSeries); // 添加一条曲线splineSeries
    axisY->setLabelFormat("%i");  // 设置显示格式
    axisY->setTitleText("温度/℃"); // 标题
    chart->addAxis(axisY, Qt::AlignLeft); // 标题位置(设置坐标轴的方向)
    axisY->setRange(0, maxY); // 范围
    splineSeries->attachAxis(axisY); // 将splineSeries附加于y轴上

    axisX->setLabelFormat("%i");
    axisX->setTitleText("时间/ms");
    chart->addAxis(axisX, Qt::AlignBottom);
    axisX->setRange(0, maxX);
    splineSeries->attachAxis(axisX); // 将splineSeries附加于x轴上 */

    chartView->setChart(chart); // 将图表的内容设置在图表视图上
    chartView->setRenderHint(QPainter::Antialiasing); // 设置抗锯齿

    setCentralWidget(chartView); // 设置为图表视图为中心部件

    timer->start(100); // 定时100ms

    connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut()));

    qsrand(time(NULL)); // 设置随机种子,随机数初始化
}

MainWindow::~MainWindow() {
}

void MainWindow::timerTimeOut() {
    receivedData(qrand() % maxY ); // 产生随机0~maxY之间的数据
}

void MainWindow::receivedData(int value) {
    data.append(value); // 将数据添加到data中

    // 当储存数据的个数大于最大值时,把第一个数据删除
    while (data.size() > maxSize) {
        data.removeFirst();
    }

    splineSeries->clear();

    int xSpace = maxX / (maxSize - 1); // 计算x轴上间距

    // 添加点,xSpace * i 表示第i个点的x轴的位置
    for (int i = 0; i < data.size(); ++i) {
        splineSeries->append(xSpace * i, data.at(i));
    }
}

splineSeries->clear():是一个用于清空 QSplineSeries 对象中的所有数据点的函数。

运行效果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day13:FTP服务

一&#xff0c;FTP概述 概述 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是用于在计算机之间传输文件的协议。它工作在网络的应用层&#xff0c;通过 TCP 协议进行数据传输&#xff0c;默认端口号为 21&#xff08;命令端口&#xff0c;另外…

2024年末Meme币市场分析:最后两个月的走势预测

进入2024年最后的两个月&#xff0c;Meme币市场正面临复杂的内外部环境&#xff0c;行情波动增大&#xff0c;许多投资者希望对年底走势做出预测&#xff0c;以便更好地调整投资策略。在这篇文章中&#xff0c;我们将从市场情绪、监管政策、技术创新和宏观经济等几个关键因素出…

ssm+vue657基于spring和vue开发的web新闻流媒体平台

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

家电智能屏方案新选择,乐鑫SoC高集成触控语音控制,启明云端乐鑫代理商

随着科技的飞速发展&#xff0c;智能家居系统正逐渐成为现代生活的一部分。在这一变革中&#xff0c;LCD屏幕作为人机交互的核心界面&#xff0c;扮演着至关重要的角色。 它们不仅提供实时信息的展示&#xff0c;还支持丰富的交互式体验&#xff0c;使得家庭管理变得更加直观和…

ceph补充介绍

SDS-ceph ceph介绍 crushmap 1、crush算法通过计算数据存储位置来确定如何存储和检索&#xff0c;授权客户端直接连接osd 2、对象通过算法被切分成数据片&#xff0c;分布在不同的osd上 3、提供很多种的bucket&#xff0c;最小的节点是osd # 结构 osd (or device) host #主…

(六)Python结构数据类型

一、集合类型&#xff08;Sets&#xff09; Sets&#xff08;集合&#xff09;是一个无序不重复的元素集。主要功能是自动清除重复的元素。创建集合时使用大括号{}包含其中元素。 Food{西瓜,南瓜,冬瓜,北瓜} print(Food) 输出结果&#xff1a; 增加重复元素&#xff0c;则会…

补齐:相交链表:扣160

梦重新开始的地方 – 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。图示两个链表在节点 c1 开始相交&#xff1a; 示例&#xff1a; 何解&#xff1f; 暴力&…

消息队列-Rabbitmq(消息发送,消息接收)

将来我们开发业务功能的时候&#xff0c;肯定不会在控制台收发消息&#xff0c;而是应该基于编程的方式。由于RabbitMQ采用了AMQP协议&#xff0c;因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息&#xff0c;都可以与RabbitMQ交互。并且RabbitMQ官方也提供了各种不…

BUUCTF re Youngter-drive

传送门&#xff1a;BUUCTF在线评测 先梳理一下这题要用到的知识点 1&#xff1a;upx的查壳与脱壳&#xff08;老朋友了&#xff0c;就不多讲了&#xff0c;可以去下面看原理&#xff09; 2&#xff1a;多线程和ida平衡堆栈 &#xff08;第一次遇到有点难懂&#xff09; 可以…

网络安全入门文档-虚拟机配置篇

前言 虚拟机作为网络安全渗透测试中常见的工具。通常被用来安装kali系统 简单解释一下&#xff0c;目前操作系统分为三类 windows、linux、mac linux又有两个小类&#xff0c;分别是RedHat、Debian 而我们要安装的kali就是基于Debian的操作系统。 简单来说。虚拟机和系统是两个…

直流稳压电源设计

一、设计任务和基本要求&#xff1a; &#xff08;1&#xff09;设计集成直流稳压电源电路。 &#xff08;2&#xff09;输出直流电压5V。 &#xff08;3&#xff09;画出逻辑电路图&#xff0c;对电路进行仿真验证&#xff0c;写出总结报告。 图 1 系统组成框图 二、进度安排…

华为认证HCIE通过需要考到多少分?_博睿谷·博睿慕课

华为认证HCIE考试主要分两部分&#xff1a;笔试实验。其中笔试部分总分为1000分&#xff0c;达到600分算通过。实验部分总分为100分&#xff0c;通过分数线为80分。 HCIE证书是华为认证体系中的最高级别认证&#xff0c;难度会相对比较高。那么&#xff0c;如何才能高分通过HCI…

基于springboot的社区团购系统设计与实现

一、项目背景 网络交易&#xff08;Electronic Commerce&#xff09;&#xff1a;是指实现整个贸易过程中各阶段的贸易活动的电子化。网络交易是一种多技术的集合体。其业务可包括&#xff1a;信息交换、售后服务、销售、电子支付、运输、组建虚拟企业、公司和贸易伙伴可以共同…

江协科技STM32学习- P32 MPU6050

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

AutoGLM:智谱AI的创新,让手机成为你的生活全能助手

目录 引言一、AutoGLM&#xff1a;开启AI的Phone Use时代二、技术核心&#xff1a;AI从“语言理解”到“执行操作”三、实际应用案例&#xff1a;AutoGLM的智能力量1. 智能生活管理&#x1f34e;2. 社交网络的智能互动&#x1f351;3. 办公自动化&#x1f352;4. 电子商务的购物…

CSGO: Content-Style Composition in Text-to-Image Generation(代码的复现)

文章目录 CSGO简介论文的代码部署需要下载的模型权重&#xff1a;复现中存在的一些问题 推理代码生成结果示意图 CSGO简介 CSGO: Content-Style Composition in Text-to-Image Generation&#xff08;风格迁移&#xff09; 本文是一篇风格迁移的论文&#xff1a;将内容参考图像…

Excel重新踩坑4:快捷键;逻辑函数;文本函数;日期相关函数;查找与引用函数;统计类函数;数组公式

0、excel常用快捷键 基础快捷键&#xff1a; alt&#xff1a;快速区域求和&#xff1b; ★ altenter&#xff1a;强制换行&#xff08;因为在excel单元格中没法用enter换行&#xff09;&#xff1b;altj&#xff1a;强制换行符的替换删除&#xff0c;这里altj就是在替换中输入…

【JavaEE初阶 — 多线程】认识线程

目录 认识线程&#xff08;Thread&#xff09; 1 线程是什么? 2 为什么要有线程 3 进程和线程的区别 区别一 区别二 区别三 区别四 4. Java的线程和操作系统线程的关系 5.创建第一个多线程程序 引入Thread类 重写run() start()与run()区别 降低多线程对CPU的占用…

链栈的引用

链栈&#xff0c;自己实现一遍&#xff0c;但是节点存储不是整数&#xff0c;存储学生信息&#xff08;年龄&#xff0c;分数&#xff0c;姓名&#xff09;三级引用。 1、建立学生信息结构体&#xff0c;将data改为学生信息结构体类型。 2、循环入栈和出栈。 #include<m…

Games101笔记-三维Transform变换(三)

1、二维矩阵转化为三维 1、将3x3的变换矩阵升维到4x4的变换矩阵即可 2、缩放及平移 3、旋转 2、视图变换 1、MVP变换&#xff1a;模型&#xff08;场景&#xff09;视图&#xff08;相机&#xff09;投影&#xff08;正交/透视&#xff09; 2、正交投影和透视投影区别 …