【QT】Qt Charts概述

news2024/11/15 12:41:15

   

目录

1 QtCharts模块

2 图表的主要组成部分

2.1 QChartView的功能

2.2 序列

2.3 坐标轴

2.4 图例

3 一个简单的QChart绘图程序


    QtCharts是Qt提供的图表模块,在Qt5.7以前只有商业版才有Qt Charts,但是从Qt5.7开始,社区版本也包含了Qt Charts。Qt Charts可以很方便地绘制常见的折线图、柱状图、饼图等图表。

1 QtCharts模块

        Qt Charts模块是一组易于使用的图表组件,它基于Qt的Graphics View架构,其核心组件是QChartView和QChart。

        QChartView的父类是QGraphicsView,就是Graphics View架构中的视图组件,所以,QChart View是用于显示图表的视图。

        QChart的继承关系如图9-1所示,可以看到,QChart是从QGraphicsItem继承而来的,所以,QChart是一种图形项。

        QPolarChart是用于绘制极坐标图的图表类,它从QChart继承而来。

要在项目中使用QtCharts模块,必须在项目的配置文件(.pro文件)中增加下面的一行语句:

Qt+=charts

        在需要使用QtCharts的类的头文件或源程序文件中,要使用如下的包含语句:

        #include <QtCharts>

        using namespace QtCharts;

        也可以使用宏定义:

        #include <QtCharts>

        Qt_CHARTS_USE_NAMESPACE

2 图表的主要组成部分

        QChartView是QChart的视图组件,而一个QChart一般包括序列、坐标轴、图例、图表标题等部分。

        QChart接口函数众多,其主要接口函数分类整理后见下表。

分组

函数名

功能描述

图表外观

void setTitle()

void setTitIeFont()

void setTitleBrush()

void setTheme()

void setMargins()

QLegend * legend()

void setAnimationOptions()

设置图表标题.显示在图表上方,支持HTML格式

设置图表标题字体

设置图表标题画刷

设置主题,主题是内置的UI设置,定义了图表的配色

设置绘图区与图表边界的4个边距

返回图表的图例

设置序列或坐标轴的动画效果

数据序列

void addSeries()

QList< QAbstractSeries > series()

void removeSeries()

void removeAIISeries()

添加序列

返回图表拥有的序列的列表

移除-个序列,但并不删除序列对象

移除并删除图表的所有序列

坐标轴

void addAxis()

QList axes() 

void setAxisX() 

void setAxisY() 

void removeAxis() 

void createDefaultAxes()

为图表的某个方向添加坐标轴 

返回某个方向的坐标轴列表 

设置某个序列的水平方向的坐标轴

设罝某个序列的垂直方向的坐标轴 

移除一个坐标轴 

根据己添加的序列的类型,创建缺省的坐标轴,前面已有的坐标轴会被删除

        setAnimationOptions(AnimationOptions options)函数设置图表的动画效果,输入参数是QChart::AnimationOptions枚举类型,有以下几种取值:

  •     QChart::NoAnimation---- 无动画效果

  •     QChart::GridAxisAnimations---- 背景网格有动画效果:

  •     QChart::SeriesAnimations---- 序列有动画效果:

  •     QChart::AllAnimations—-—都有动画效果

2.1 QChartView的功能

        QChartView是QChart的视图组件,类似于GraphicsView架构中的QGraphicsView。实际上,在窗口设计界面上使用QChartView时,就是先放置一个QGraphicsView组件,然后升级为QChartView。

QChartView类定义的函数很少,只有以下几个。

  • void setChart(QChart *chart),设置一个QChart对象作为显示的图表。

  • QChart* chart(),返回QChartView当前设置的QChart类对象。

  • void setRubberBand(RubberBands &rubberBand),设置选择框的类型,即鼠标在视图组件上拖动选择范围的方式,是一个QChartView::RubberBand枚举类型的组合,QChartView::

RubberBand枚举类型有以下几种取值:

  • QChartView::NoRubberBand—无选择框;

  • QChartView::VerticalRubberBand—垂向选择:

  • QChartView::HorizontalRubberBand—水平选择;

  • QChartView::RectangleRubberBand—矩形框选择;

  • RubberBandsrubberBand(),返回设置的选择框类型。

2.2 序列

        序列是数据的表现形式,如图9-2中的两条曲线就是两个QLineseries类型的序列。

        图表的类型主要就是由序列的类型决定的,常见的图表类型有折线图、柱状图、饼图、散点图等,QtCharts能实现的常见图表示例及用到的序列类见表9-1。

        图9-3是这些序列类的继承关系,可见它们都是从QAbstractSenes类继承而来的。折线、光滑线和散点的序列是从QXYSeries继承而来,用于绘制二维平面的数据;QAbstractBarSeries派生出柱状图、百分比柱状图和堆叠图等图表的序列;面积图、火柴盒图、饼图的序列都直接继承于QAbstractSeries。

      QLineSeries的主要函数见下表:

分组

函数

功能描述

序列名称

void setName()

void setName()

图表

QChart* chart()

返回序列所属的图表对象

序列外观

void setVisibte()

void show()

void hide()

void setColor()

void setPen()

void setBrush()

void setOpacity()

设置序列可见性

显示序列,使序列可见

隐藏序列,使序列不可见

设置序列线条的颜色

设置绘制线条的颜色

设置绘制数据点的画刷

设置序列的透明度,0表示完全透明,1表示不透明

数据点

void setPointsVisible()

void append()

void insert()

void replace()

void clear()

void remove()

void removePoints()

int count()

QPointF& at()

QList<QPointF> points()

QVetor<QPointF> pointsVector()

设置数据点的可见性

添加一个数据点到序列

在某个位置插入一个数据点

替换某个数据点

清除所有数据点

删除某个数据点

从某个位置开始,删除指定个数的数据点

数据点的个数

返回某个位置上的数据点

返回数据点的列表

返回数据点的列表,效率更高

数据点标签

void setPointLabeIsVisible()

void setPointLabelsColor()

void setPointLabelsFont()

void setPointLabelsFormat()

void setPointLabelsClipping()

设置数据点标签的可见性

设置数据点标签的文字颜色

设置数据点标签字体

设置数据点标签格式

设置标签的裁剪属性,缺省为True,即绘图区外的标签被裁剪掉

坐标轴

bool attachAxis()

bool detachAxis()

Qlist attachedAxes()

为序列附加-个坐标轴,通常需要一个X轴和一个Y轴

解除一个附加的坐标轴

返回附加的坐标轴的列表

2.3 坐标轴


        一般的图表都有横轴和纵轴两个坐标轴,如折线图一般表示数据,坐标轴用QValueAxis类的数值坐标轴,如果用对数坐标,就可以使用QLogValueAxis类的坐标轴;柱状图的横坐标通常是文字,可以用QBarCategoryAxis作为横轴,而饼图一般没有坐标轴。
        Qt Charts的坐标轴类、特点及其适用情况见表9-2,类的继承关系如图9-4所示。

        QValueAxis类的 主要函数见下表:

分组

函数

功能描述

坐标轴整体

void setVisible()

Qt::Orientation orientation()

void setMin()

void setMax()

void setRange()

设置坐标轴可见性

返回坐标轴方向

设置坐标轴最小值

设置坐标轴最大值

设置坐标轴最小最大值表示的范围

void setLabelFormat()  

void setLabelsAngle()

void setLabelsBrush()

void setLabelsColor()  

void setLabe!sFont()

void setLabelsVisible()

void setLabelFormat()  

void setLabelsAngle()

void setLabelsBrush()

void setLabelsColor()  

void setLabe!sFont()

void setLabelsVisible()

设置标签格式,例如可以设置显示的小数点位数

设置标签的角度,单位为度

设置标签的画刷

设置标签文字颜色

设置标签文字字体

设置轴标签文字是否可见

轴线和刻度线

void setTickCount()

void setLineVisible()

void setLinePen()

void setLinePenColor()

设置坐标轴主刻度的个数

设置轴线和刻度线的可见性、

设置轴线和刻度线的凼笔

设置轴线和刻度线的颜色

主网格线

void setGridUneColor()  

void setGridLinePen()  

void setGridLineVisible()

设置网格线的颜色

设置网格线的画笔

设置网格线的可见性

次刻度线和次网格线

void setMinorTickCount()

void setMinorGridLineColor()

void setMinorGridLinePen()

void setMinorGridLineVisible()

设置两个主刻度之间的次刻度的个数

设置次网格线的颜色

设置次网格线的画笔

设置次网格线的可见性

    坐标轴类封装了坐标轴的刻度、标签、网格线、标题等属性,QValueAxis坐标轴有以下几个组成部分:
    • 坐标轴标题:是在坐标轴下方显示的文字,表示坐标轴的名称,图中X轴坐标轴的标题是 "time(secs)"。坐标轴标题除了可以设置文字内容,还可以设置字体、画刷和可见性。
    • 轴线和刻度线:轴线是图中从左到右的表示坐标轴的直线,刻度线是垂直于轴线的短线, 包括主刻度线和次刻度线,主刻度个数是tickCount(),每两个主刻度之间的次刻度的个数是 minorTickCount()。
    • 轴标签:在主刻度处显示的数值标签文字,可以控制其数值格式、文字颜色和字体等。
    • 主网格线:在绘图区与主刻度对应的网格线,可以设置其颜色、线条的pen属性、可见 性等。
    • 次网格线:在绘图区与次刻度对应的网格线,可以设置其颜色、线条的pen属性、可见 性等。

2.4 图例

        图例(Legend)是对图表上显示的序列的示例说明,如图9-2中为两条曲线显示的图例,有 线条颜色和文字说明。QLegend是封装了图例控制功能的类,可以为每个序列设置图例中的文字, 可以控制图例显示在图表的上、下、左、右不同位置。 对于图例还有一个类QLegendMarker,可以为每个序列的图例生成一个类似于QCheckBox的 组件,在图例上单击序列的标记,可以控制序列是否显示。
        例如,设置图例显示在图表的底部可用下面的语句:
ui.chartView->chart()->legend()->setAlignment(Qt::AlignBottom);
        设置图例文字的字体的代码如下:
void MainWindow::on_btnLegendFont_clicked(){    
    //图例的字体设置    
    QFont font=ui->chartView->chart()->legend()->font();    
    bool ok=false;    
    font=QFontDialog::getFont(&ok,font);    
    if (ok)        
    ui.chartView->chart()->legend()->setFont(font);
}

3 一个简单的QChart绘图程序

        先用一个简单实例程序说明QChart绘图的基本原理。创建一个基于QMainWindow的应用程 序samp9_1,主窗口上不放置任何组件。在主窗口类中只定义一个createChart()函数,在主窗口的 构造函数中调用此函数,即:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    createChart();
}

 createChart()函数用于创建图表,其代码如下:

void MainWindow::createChart()
{ //创建图表
    QChartView *chartView=new QChartView(this); //创建 ChartView

    QChart *chart = new QChart(); //创建 Chart
    chart->setTitle("简单函数曲线");

    chartView->setChart(chart); //Chart添加到ChartView
    this->setCentralWidget(chartView);

//创建曲线序列
    QLineSeries *series0 = new QLineSeries();
    QLineSeries *series1 = new QLineSeries();
    series0->setName("Sin曲线");
    series1->setName("Cos曲线");
    chart->addSeries(series0); //序列添加到图表
    chart->addSeries(series1);


//    QPen    pen;
//    pen.setStyle(Qt::DotLine);//Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine
//    pen.setWidth(2);
//    pen.setColor(Qt::red);
//    series0->setPen(pen);

//    pen.setStyle(Qt::SolidLine);//Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine
//    pen.setColor(Qt::blue);
//    series1->setPen(pen);

//序列添加数值
    qreal   t=0,y1,y2,intv=0.1;
    int cnt=100;
    for(int i=0;i<cnt;i++)
    {
        y1=qSin(t);//+qrand();
        series0->append(t,y1);

        y2=qSin(t+20);
        series1->append(t,y2);

        t+=intv;
    }

//    chart->createDefaultAxes();
//    chart->axisX()->setTitleText("time(secs)");
//    chart->axisY()->setTitleText("value");

//创建坐标轴
    QValueAxis *axisX = new QValueAxis; //X 轴
//    curAxis=axisX;
    axisX->setRange(0, 10); //设置坐标轴范围
//    axisX->setLabelFormat("%.1f"); //标签格式
//    axisX->setTickCount(11); //主分隔个数
//    axisX->setMinorTickCount(4);
    axisX->setTitleText("time(secs)"); //标题
//    axisX->setGridLineVisible(false);

    QValueAxis *axisY = new QValueAxis; //Y 轴
    axisY->setRange(-2, 2);
    axisY->setTitleText("value");
//    axisY->setTickCount(5);
//    axisY->setMinorTickCount(4);
//    axisY->setLabelFormat("%.2f"); //标签格式
//    axisY->setGridLineVisible(false);

    chart->setAxisX(axisX, series0); //为序列设置坐标轴
    chart->setAxisY(axisY, series0); //

    chart->setAxisX(axisX, series1); //为序列设置坐标轴
    chart->setAxisY(axisY, series1); //
}

   程序运行后界面如图9-2所示。

        在createChart()函数里,首先创建一个QChartView对象chartView,再创建一个QChart对象chart,将chart在chartView里显示,使用下面一行语句:

chartView->setChart(chart);

        图表上用于显示数据的称为序列(series),这里使用折线序列QLineSeries,创建了两个QLineSeries类型的序列,并且将序列添加到chart中。

chart->addSeries(series0);

chart->addSeries(series1);

        序列存储用于显示的数据,所以需要为直线序列添加平面数据点的坐标数据。程序将生成正弦和余弦函数的数据作为序列的数据。

        序列还需要坐标轴,创建QValueAxis类型的坐标轴作为图表的X轴和Y轴,调用QChart的setAxisX()和setAxisY()函数为两个序列分别设置X轴和Y轴。

图9-2实例samp9_1运行时界面

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

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

相关文章

fortigate 防火墻通過CLT命令行 downgrade降級IOS

​Troubleshooting Tip: Downgrade of FortiOS fails due to BIOS check 通過u盤放入2個文件(Os命名為image.out,配置文件命名為fgt_system.conf),插入 fortigate 防火墻。一般防火墻就自動更新OS,但如果要降級,不會自動更新,需要在CLT裡頭操作一些設置後才能順利降級 …

指针中的回调函数与qsort的深度理解与模拟

今天给大家在更新一下指针类型的知识&#xff0c;这里讲到了一个库函数sqort&#xff0c;以及回调函数的理解。 望喜欢 目录 回调函数 qsort函数 qsort模拟实现 回调函数 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数…

Java - 获取汉字大写首字母输出

背景 有个项目需要将一批字符串的拼音首字母输出并大写&#xff0c;写了个工具类。 实现 需要引入外部jar。 <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version> </dep…

数字人解决方案——阿里EMO音频驱动肖像生成能说话能唱歌的逼真视频

前言 数字可以分为3D数字人和2D数字人。3D数字人以虚幻引擎的MetaHuman为代表&#xff0c;而2D数字人则现有的图像或者视频做为输入&#xff0c;然后生成对口型的数字人&#xff0c;比如有SadTalker和Wav2Lip。 SadTalker&#xff1a;SadTalker是一种2D数字人算法&#xff0c;…

Android 中get请求网络数据 详细举例

请求链接 https://api.bilibili.com/x/web-interface/ranking 1.添加网络权限 依赖等 implementation com.squareup.okhttp3:okhttp:4.9.3 implementation com.google.code.gson:gson:2.8.92.写请求类network package com.example.myapplication;import android.graphics.Bi…

【C语言】Leetcode 876. 链表的中间节点

主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《Leetcode》 题目 通过题目的要求可以判断出有两种示例要解决&#xff0c;一种是偶数节点的链表&#xff0c;一种是奇数节点的链表&#xff0c;应对这两种情况我们需要使程序对二者都可以兼容。 解决思路 struct ListNode…

【论文精读】I-JEPA

摘要 计算机视觉中&#xff0c;常采用基于不变性和基于生成的方法进行自监督学习。对比学习&#xff08;CL&#xff09;是典型的基于不变性的方法&#xff0c;通过预训练方法优化编码器&#xff0c;使其能生成同一图像的两个或多个视图的相似嵌入&#xff0c;其中图像视图通常由…

Linux安全加固功能

提示:工具下载链接在文章最后 目录 一.加固功能介绍二.配置加固功能1.配置安全加固功能1.1 开放目前设备监听的所有端口1.2 只开放80、443、20、21、22端口1.3 防火墙配置工具1.3.1 开放允许访问的端口1.3.2 删除允许访问的端口1.3.3 添加IP地址允许访问规则1.3.4 添加IP地址禁…

脾胃论笔记

焦虑会导致脾胃受伤 焦虑等不良情绪也会导致脾胃受伤&#xff0c;我们称其为肝气不舒。肝气不舒会导致脾胃系统出问题&#xff0c;这叫肝木横逆克脾土&#xff0c;木克土&#xff0c;脾胃就容易受伤。 这样的情况在现代社会特别多。这跟古人就不一样&#xff0c;古人生活相对…

matplotlib.animation 3d姿态动画

目录 演示效果&#xff1a; 演示代码&#xff1a; 保存为gif 演示效果&#xff1a; 演示代码&#xff1a; import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.animation import FuncAnimation# 定义人体关键点…

Vue3 五天速成

文章目录 day 11. 创建vue3工程3. 响应式数据4. 计算属性 day 25. watch 监视6. watchEffect7. 标签的ref属性 day 38. 回顾TS中的接口_泛型_自定义类型9. props的使用10. 生命周期11. 自定义Hooks12. 路由 基本切换效果13. 路由 两个注意点14. 路由 路由器的工作模式15. 路由 …

鸿蒙 Stage模型-AbilityStage、Context、Want

前提&#xff1a;基于官网3.1/4.0文档。参考官网文档 基于Android开发体系来进行比较和思考。&#xff08;或有偏颇&#xff0c;自行斟酌&#xff09; 一、 AbilityStage 1.概念 AbilityStage是一个Module级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilitySt…

步进电机驱动器接法

实物 参数 共阳极&#xff1a; 使能给高电平有效 共阴极&#xff1a; 使能给低电平有效 整体接线 参考内容 B站UP范辉

Google Play上架:2024年五月份政策自查之敏感信息访问权限和 API(适用于上架被拒和因AI扫荡被下架或封号)

本文根据谷歌上架政策协议截止日期归纳而出&#xff0c;提供上架遇到问题的开发者们&#xff0c;感谢支持&#xff0c;如有不足&#xff0c;欢迎补充。 关于敏感信息访问权限和 API的相关政策 政策公布日期政策相关内容相关补充内容政策截止日期 政策公布日期 公布日期&#x…

【QT】窗口的大小标题图标设置

窗口的大小标题图标设置 添加一个新的类 创建完成&#xff0c;根据上一节最后的在总结&#xff0c;做个测试&#xff1a; #include "mybutton.h" #include <QDebug>//打印&#xff0c;标准输出 MyButton::MyButton(QWidget *parent) : QPushButton(parent) { …

INFINI Labs 产品更新 | Easysearch 1.7.1发布

INFINI Labs 产品又更新啦~&#xff0c;包括 Console&#xff0c;Gateway&#xff0c;Agent 1.23.0 和 Easysearch 1.7.1。此次版本重点修复历史遗留 Bug 、网友们提的一些需求等。以下是本次更新的详细说明。 INFINI Console v1.23.0 INFINI Console 是一款非常轻量级的多集…

ATFX汇市:油价回落之际加元币值走弱,USDCAD有望刷新年内新高

ATFX汇市&#xff1a;加元是商品货币&#xff0c;币值受到国际油价和精炼石油出口的显著影响。2022年3月份&#xff0c;国际油价达到130美元的峰值水平&#xff0c;随后开启回落走势&#xff0c;时至今日&#xff0c;最新报价在80美元下方&#xff0c;累计跌幅近40%。疲弱的油价…

根据用户名称实现单点登录

一、参数格式 二、后端实现 Controller层 public class IAccessTokenLoginController extends BaseController {Autowiredprivate ISysUserService sysUserService;Autowiredprivate ISingleTokenServiceImpl tokenService;/*** 登录方法** return 结果*/PostMapping("/l…

小家电压力锅WIFI模块供电AC-DC电源芯片特点与SM6035解析

WIFI模块供电的是一种将AC-DC电源芯片交流电转换为直流电的芯片&#xff0c;通常用于为WIFI模块提供电源。这种芯片具有高效、紧凑和可靠等特点&#xff0c;能够满足各种应用场景的需求。 其中&#xff0c;离线开关电源芯片是一种常见的AC-DCLED电源芯片&#xff0c;它通常包括…