【QT】Qt Charts概述

   

目录

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运行时界面

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

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

相关文章

基于SpringBoot+Apache POI的前后端分离外卖项目-苍穹外卖(十九)

数据导出 1. 工作台1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.2.1 Controller层1.2.2 Service层接口1.2.3 Service层实现类1.2.4 Mapper层 1.3 功能测试 2. Apache POI2.1 介绍2.2 入门案例2.2.1 将数据写入Excel文件2.2.2 读取Excel文件中的数据 3. 导出运营数据Excel…

重学SpringBoot3-yaml文件配置

重学SpringBoot3-yaml文件配置 引言YAML 基本语法YAML 数据类型YAML 对象YAML 数组复合结构标量引用 YAML 文件结构Spring Boot 中的 YAML 配置注意事项总结参考 引言 YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种常用于配置文件的数据序列化格式&#xff…

LabVIEW起重机工作参数远程监测系统

LabVIEW起重机工作参数远程监测系统 随着起重机技术的持续发展&#xff0c;对其工作参数的实时监控需求日益增加。设计了一个基于LabVIEW和TBox的起重机工作参数远程监测系统&#xff0c;能够实现起重机工作参数的实时采集、传输、解析和显示&#xff0c;有效提升起重机的性能…

【Linux-shell系列】多脚本同时启动

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于51单片机风速仪风速测量台风预警数码管显示

基于51单片机风速仪风速测量报警数码管显示 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接&#xff1a; 基于51单片机风速仪风速测量报警数码管显示( proteus仿真程序设计报告讲解视频&…

Elasticsearch:使用 Streamlit、语义搜索和命名实体提取开发 Elastic Search 应用程序

作者&#xff1a;Camille Corti-Georgiou 介绍 一切都是一个搜索问题。 我在 Elastic 工作的第一周就听到有人说过这句话&#xff0c;从那时起&#xff0c;这句话就永久地印在了我的脑海中。 这篇博客的目的并不是我出色的同事对我所做的相关陈述进行分析&#xff0c;但我首先…

第 5 章 ROS常用组件坐标msg消息(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 在ROS中内置一些比较实用的工具&#xff0c;通过这些工具可以方便快捷的实现某个功能或调试程序&#xff0c;从…

仿牛客网项目---关注模块的实现

本篇文章是关于我的项目的关注模块的开发。 关注模块的开发实现了用户之间的关注功能和关注列表的展示。通过使用相应的服务类处理关注和取消关注操作&#xff0c;并利用用户服务类获取用户信息&#xff0c;实现了关注功能的存储和查询。同时&#xff0c;通过触发关注事件&…

记一次:android学习笔记一(学习目录-不要看无内容)

学习目录如下 B站学习的名称--Android开发从入门到精通(项目案例版) 网址:https://www.bilibili.com/video/BV1jW411375J/ 第0章:安装 android stoid 参考地址https://blog.csdn.net/adminstate/article/details/130542368 第一章:第一个安卓应用 第二章:用户界面设…

SpringBoot使用MongoTemplate详解

1.pom.xml引入Jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 2.MongoDbHelper封装 /*** MongoDB Operation class* author HyoJung* date …

37.云原生之springcloud+k8s+GitOps+istio+安全实践

云原生专栏大纲 文章目录 准备工作项目结构介绍配置安全测试ConfigMapSecret使用Secret中数据的方式Deployment使用Secret配置Secret加密 kustomize部署清单ConfigMap改造SecretSealedSecretDeployment改造Serviceistio相关资源DestinationRuleGatewayVirtualServiceServiceAc…

(3)(3.2) MAVLink2数据包签名(安全)

文章目录 前言 1 配置 2 使用 3 MAVLink协议说明 前言 ArduPilot 和任务计划器能够通过使用加密密钥添加数据包签名&#xff0c;为空中 MAVLink 传输增加安全性。这并不加密数据&#xff0c;只是控制自动驾驶仪是否响应 MAVLink 命令。 当自动驾驶仪处于激活状态时&#x…

未来已来!AI大模型引领科技革命

未来已来&#xff01;AI大模型正以惊人的速度引领着科技革命。随着科技的发展&#xff0c;人工智能在各个领域展现出了非凡的能力和潜力&#xff0c;大模型更是成为了科技领域的明星。从自然语言处理到图像识别&#xff0c;从智能推荐到语音识别&#xff0c;大模型的应用正在改…

python自学3

第一节第六章 数据的列表 列表也是支持嵌套的 列表的下标索引 反向也可以 嵌套也可以 列表的常用操作 什么是列表的方法 学习到的第一个方法&#xff0c;index&#xff0c;查询元素在列表中的下标索引值 index查询方法 修改表功能的方法 插入方法 追加元素 单个元素追加 多…

如何应对IT服务交付中的问题?

如何应对IT服务交付中的问题&#xff1f; 按需交付服务的挑战IT服务体系的复杂性恶性循环的形成学会洞察的重要性书籍简介参与方式 按需交付服务的挑战 一致性、可靠性、安全性、隐私性和成本效益的平衡&#xff1a;成功的按需交付服务需要满足这些要求&#xff0c;这需要服务…

2024年UI排版风格解析,经典模板一键复用!

在UI设计工作中&#xff0c;如何保证版式设计的“美观 合理”是经常需要考虑问题。经过了多年的设计工作后&#xff0c;笔者发现新人设计师的尤其容易陷入对流行趋势的简单模仿&#xff0c;缺失对排版本身的逻辑性认知。在这篇文章中&#xff0c;笔者将盘点10个经典UI排版案例…

PCL中的点云分割模型的部分常用参数含义

PCL中的SacModel类别常用参数含义 1、SACMODEL_PLANE2、SACMODEL_LINE&#xff08;三维直线&#xff09;3、SACMODEL_CIRCLE2D&#xff08;二维圆&#xff09;4、SACMODEL_CIRCLE3D&#xff08;三维圆&#xff09;5、SACMODEL_SPHERE&#xff08;球&#xff09;6、SACMODEL_CYL…

Jenkins 将shell脚本启动方式修改为bash

platform"arm x86" if [[ "$platform" ~ "arm" ]] thenecho "arm" fi最近在调试Jenkins实现的一些功能&#xff0c;发现在本地可以运行的脚本内容到了Jenkins里面就没办法运行了&#xff0c;不是提示unexpected operator就是提示[[ : …

Uni-ControlNet: All-in-One Control toText-to-Image Diffusion Models——【论文笔记】

本文发表于NeurIPS 2023 项目官网&#xff1a;Uni-ControlNet: All-in-One Control to Text-to-Image Diffusion Models 一、Introduction 近两年来&#xff0c;扩散模型在图像合成任务中表现优异&#xff0c;尤其是文本到图像&#xff08;T2I&#xff09;扩散模型已成为合成高…

WebGIS开发0基础必看教程:地图显示——根据地理范围换算出瓦片行列号

2.影像金字塔简介 我们之前反复提到了影像金字塔这个概念&#xff0c;但是没有对其做一个大概的介绍&#xff0c;这里我将这个概念补充一下。 2.1 为什么要出现影像金字塔这个概念 现在&#xff0c;我假设我们的服务器上有一个1G的影像&#xff0c;需要将其在前端进行显示。…