QT数据可视化框架编程实战之三维柱状图从入门到精通_补天云QT技术培训专家

简介

本文将介绍QT数据可视化框架(QT DataVisualization 模块)编程实战之三维柱状图(Q3DBars)的一些常规用法。包括三维柱状图组件的介绍,入门应用实例,QT数据可视化框架和QWidget窗口组合应用实例,以及多系列三维柱状图的应用实例。还包括对三维柱状图的标签(label)和标题(title)的应用实例的介绍。

正文

QT数据可视化框架三维柱状图组件

QT数据可视化框架包含三种图形可视化,分别是三维柱状图(Q3DBars)、三维散点图(Q3DScatters),和三维曲面图(Q3DSurface)。本文只关注对三维柱状图组件的介绍和应用实例。

QT数据可视化框架三维柱状图入门应用实例

三维柱状图运行效果

下图就是一个使用QT数据可视化框架生成的典型的三维柱状图。


这个三维柱状图由坐标轴和柱体组成。

QT三维柱状图Q3DBars类型

Q3DBars类型是QT数据可视化框架提供的几种重要的三维组件之一,用于实现三维柱状图。QT数据可视化图形的基类是QAbstract3DGraph类型。

Q3DBars是一个QT对象类型,也就是祖宗类型是QObject类型。Q3DBars自身支持三个坐标轴:

X轴(列):这是一个三维类别坐标轴。
columnAxis : QCategory3DAxis*

Z轴(行):这也是一个三维类别坐标轴。
rowAxis : QCategory3DAxis*

Y轴(高):这是一个三维数值坐标轴。
valueAxis : QValue3DAxis*

什么是类别坐标轴(QCategory3DAxis)? 所谓类别坐标轴,就是这个坐标轴所表示的维度可以支持文本标签,适合于表达类似“初级”、“中级”、“高级”这样的分类概念。

什么是数值坐标轴(qValue3DAxis)?所谓数值坐标轴,就是这个坐标轴所表示的维度可以支持一些列连续的数值,适合于表示类似各种数量计量统计,比如身高、体重等。

QT三维柱状图序列QBar3DSeries类型

前面介绍了三维柱状图类型Q3DBars,现在看到三维柱状图的序列类型QBar3DSeries,是不是感到比较诡异呢? 本文作者看到这种类型命名形式的不统一之后,也感到有一些诡异。毕竟QT框架是一个复杂而庞大的优秀的框架,还是表示尊重,就不妄加非议了。

言归正传,到底什么是序列呢?所谓序列,就是通过一组数据点产生的一种图形。比如一个三维柱状图序列, 就是一组数据点生成的若干柱体组成的图形。在一个三维柱状图中,可以包含一个或多个三维柱状图序列。不同的图,只能使用特定的与之适应的序列。

应用实例的源码

QT数据可视化框架底层支持使用基于opengl等图形渲染引擎的图形硬件加速,因此图形渲染性能有保证。QT框架之所以是一个高性能的图形界面开发框架,就是因为QT框架包括数据可视化和QML等组件在内的多种组件的底层都支持opengl等多种图形渲染引擎,也就是都支持图形硬件加速。

main.cpp文件源码如下所示。

#include <QApplication>
#include <Q3DBars>
#include <QBar3DSeries> int main(int argc, char *argv[])
{
//通过环境变量指定后端渲染引擎为opengl。
qputenv("QSG_RHI_BACKEND", "opengl"); //实际上只使用QGuiApplication就可以的。
QApplication a(argc, argv); //定义QT三维柱状图对象实例
Q3DBars bars;
//Q3DBars本身可以包含窗口边框,也可以不包含。
bars.setFlags(bars.flags() ^ Qt::FramelessWindowHint);
//Z轴(行)的范围,最多可包含五行,也就是在Z轴方向上最多有五个数据点
bars.rowAxis()->setRange(0, 4);
//X轴(列)的范围,最多可包含五列。
bars.columnAxis()->setRange(0, 4); //创建一个序列对象
QBar3DSeries* series = new QBar3DSeries();
//创建一个数据行对象
QBarDataRow* row = new QBarDataRow();
//设定该数据行的数值
*row << 1.0f << 3.0f << 5.0f << 7.0f << 9.0f;
//将数据行加入到序列中
series->dataProxy()->addRow(row); //将序列加入到三维柱状图中
bars.addSeries(series); //将三维柱状图所在窗口显示出来。
bars.show(); return a.exec();
}

QT数据可视化框架和QWidget窗口组合应用实例

Q3DBars的类型继承体系

从Q3DBars的类型继承体系可以看到,Q3DBars实际上只是一个QWindow,而不是QWidget。
Q3DBars -> QAbstract3DGraph->(QWindow,QOpenGLFunctions)。

在QT框架中存在两种类型的窗口,一种是常规GUI的栅格窗口,另外一种是OpenGL窗口。现在QT数据可视化框架的需求是必须支持图形硬件加速,也就是必须使用OpenGL,那么应该选择支持OpenGL窗口的技术路线。这也存在几种技术路线,但是根据依赖最小化的设计原则,显然使用QWindow作为基类是很好的选择。

关于QT窗口系统的底层窗口的介绍,可以参考下面这个文章:

QT6窗口系统之QT底层窗口QWindow:QT框架中哪些常见窗口是基于QWindow的? 如何实现QT框架栅格窗口?如何实现QT框架OpenGL窗口?

Q3DBars如何和QWidget窗口搭配使用?

QT数据可视化框架中的包括三维柱状图在内的图形,都是基于QWindow这种底层窗口的,那么这种窗口能和常用的QWidget窗口搭配使用吗? 答案是可以的。

在QWidget类型中提供了一个静态函数,用于根据一个QWindow窗口来创建一个QWidget窗口,将指定的QWindow窗口包含在内。

[static] QWidget *QWidget::createWindowContainer(QWindow *window, QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())

有了创建出来的这个QWidget窗口,那么QT数据可视化框架中的图形窗口,就可以和QWidget搭配使用了。

Q3DBars和QWidget组合应用实例运行效果

QT数据可视化框架三维柱状图窗口和QWidget窗口搭配使用的应用实例运行效果如下所示。

源码

ButianyunWidget具体源码如下所示。

#include "butianyunwidget.h"
#include <Q3DBars>
#include <QBar3DSeries>
#include <QVBoxLayout>
#include <QPushButton> ButianyunWidget::ButianyunWidget(QWidget *parent)
: QWidget(parent)
{
//垂直布局
QVBoxLayout* main_layout = new QVBoxLayout();
setLayout(main_layout); //按钮控件
QPushButton* button_a = new QPushButton(QStringLiteral("补天云QT系列视频课程"));
main_layout->addWidget(button_a); //QT数据可视化框架三维柱状图,是一个QWindow窗口
Q3DBars* bars = new Q3DBars(nullptr);
bars->setFlags(bars->flags() | Qt::FramelessWindowHint);
bars->rowAxis()->setRange(0, 2);
bars->columnAxis()->setRange(0, 5); QBar3DSeries* series = new QBar3DSeries();
QBarDataRow* row = new QBarDataRow();
*row << 1.0f << 3.0f << 5.0f << 7.0f << 9.0f;
series->dataProxy()->addRow(row);
bars->addSeries(series); //创建出一个QWidget窗口
QWidget* bars_widget = QWidget::createWindowContainer(bars);
main_layout->addWidget(bars_widget); //按钮控件
QPushButton* button_b = new QPushButton(QStringLiteral("补天云QT技术培训专家"));
main_layout->addWidget(button_b);
}

QT数据可视化框架多系列三维柱状图

运行效果

使用QT数据可视化框架创建的包含三个序列的三维柱状图的运行效果如下所示。这三个序列使用的颜色分别是红色、绿色和蓝色。在这个实例中,由于设置了坐标轴的标签和格式字符串,当用户选中某一个柱体时,将会显示出该柱体的一些信息。

源码

源码如下所示。

ButianyunWidget::ButianyunWidget(QWidget *parent)
: QWidget(parent)
{
QVBoxLayout* main_layout = new QVBoxLayout();
setLayout(main_layout); Q3DBars* bars = new Q3DBars(nullptr);
bars->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
bars->setFlags(bars->flags() | Qt::FramelessWindowHint); //X轴(列)的标题
bars->columnAxis()->setTitle(QStringLiteral("季度"));
//X轴标题可见
bars->columnAxis()->setTitleVisible(true); //X轴的标签,每一列(也就是每一个数据点)对应一个标签
QStringList labels_column;
labels_column << QStringLiteral("第一季度") << QStringLiteral("第二季度")
<< QStringLiteral("第三季度") << QStringLiteral("第四季度");
bars->columnAxis()->setLabels(labels_column);
bars->columnAxis()->setRange(0, 4); //Y轴(高)的标题
bars->valueAxis()->setTitle(QStringLiteral("学员数量"));
//Y轴的标签格式字符串
bars->valueAxis()->setLabelFormat(QStringLiteral("%.0f 千个"));
bars->valueAxis()->setRange(0, 100); //三个序列的颜色
const QColor colors[] = {QColor(255, 0, 0), QColor(0, 255, 0), QColor(0, 0, 255)};
//三个序列的名称
const QString names[] = {QStringLiteral("2021年"), QStringLiteral("2022年"), QStringLiteral("2023年")};
//依次创建三个序列并加入到三维柱状图中
for (int i = 0; i < 3; i++)
{
QBar3DSeries* series = new QBar3DSeries();
series->setName(names[i]);
series->setBaseColor(colors[i]);
series->setItemLabelFormat((QStringLiteral("@seriesName @colLabel @valueTitle: @valueLabel")));
QBarDataRow* row = new QBarDataRow();
*row << 10.0f + i * 30 << 30.0f + i * 20 << 50.0f + i * 10 << 70.0f + i * 10;
series->dataProxy()->addRow(row);
bars->addSeries(series);
} QWidget* bars_widget = QWidget::createWindowContainer(bars);
main_layout->addWidget(bars_widget);
}

总结

本文介绍了QT数据可视化框架(QT DataVisualization 模块)编程实战之三维柱状图(Q3DBars)的一些常规用法。包括三维柱状图组件的介绍,入门应用实例,QT数据可视化框架和QWidget窗口组合应用实例,以及多系列三维柱状图的应用实例。还包括对三维柱状图的标签(label)和标题(title)的应用实例的介绍。

如果您认为这篇文章对您有所帮助,请您一定立即点赞+喜欢+收藏,本文作者将能从您的点赞+喜欢+收藏中获取到创作新的好文章的动力。如果您认为作者写的文章还有一些参考价值,您也可以关注这篇文章的作者。

QT数据可视化框架编程实战之三维柱状图从入门到精通_补天云QT技术培训专家的更多相关文章

  1. D3js初探及数据可视化案例设计实战

    摘要:本文以本人目前所做项目为基础,从设计的角度探讨数据可视化的设计的方法.过程和结果,起抛砖引玉之效.在技术方案上,我们采用通用web架构和d3js作为主要技术手段:考虑到项目需求,这里所做的可视化 ...

  2. 大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息

    1 RDD编程实战案例一 数据样例 字段说明: 其中cid中1代表手机,2代表家具,3代表服装 1.1 计算订单分类成交金额 需求:在给定的订单数据,根据订单的分类ID进行聚合,然后管理订单分类名称, ...

  3. Qt数据可视化(散点图、折线图、柱状图、盒须图、饼状图、雷达图)开发实例

    ​  目录 散点图 折线图 柱状图 水平柱状图 水平堆叠图 水平百分比柱状图 盒须图 饼状图 雷达图 Qt散点图.折线图.柱状图.盒须图.饼状图.雷达图开发实例. 在开发过程中我们会使用多各种各样的图 ...

  4. 【逆向&编程实战】Metasploit安卓载荷运行流程分析_复现meterpreter模块接管shell

    /QQ:3496925334 作者:MG193.7 CNBLOG博客号:ALDYS4 未经许可,禁止转载/ 关于metasploit的安卓模块,前几次的博客我已经写了相应的分析和工具 [Android ...

  5. 【逆向&编程实战】Metasploit中的安卓载荷凭什么吊打SpyNote成为安卓端最强远控

    文章作者:MG1937 QQ:3496925334 CNBLOG:ALDYS4 未经许可,禁止转载 前言 说起SpyNote大家自然不陌生,这款恶意远控软件被利用在各种攻击场景中 甚至是最近也捕获到了 ...

  6. 【Java编程实战】Metasploit_Java后门运行原理分析以及实现源码级免杀与JRE精简化

    QQ:3496925334 文章作者:MG1937 CNBLOG博客ID:ALDYS4 未经许可,禁止转载 某日午睡,迷迷糊糊梦到Metasploit里有个Java平台的远控载荷,梦醒后,打开虚拟机, ...

  7. 前端数据可视化echarts.js使用指南

    一.开篇 首先这里要感谢一下我的公司,因为公司需求上面的新颖(奇葩)的需求,让我有幸可以学习到一些好玩有趣的前端技术,前端技术中好玩而且比较实用的我想应该要数前端的数据可视化这一方面,目前市面上的数据 ...

  8. 使用bokeh-scala进行数据可视化

    目录 前言 bokeh简介及胡扯 bokeh-scala基本代码 我的封装 总结 一.前言        最近在使用spark集群以及geotrellis框架(相关文章见http://www.cnbl ...

  9. 前端数据可视化echarts.js

    一.echarts.js的优势与总体情况 echarts.js作为国内的IT三巨头之一的百度的推出一款相对较为成功的开源项目,总体上来说有这样的一些优点 1.容易使用 echarts.js的官方文档比 ...

  10. 【Android编程实战】源码级免杀_Dex动态加载技术_Metasploit安卓载荷傀儡机代码复现

    /文章作者:MG193.7 CNBLOG博客ID:ALDYS4 QQ:3496925334/ 在读者阅读本文章前,建议先阅读笔者之前写的一篇对安卓载荷的分析文章 [逆向&编程实战]Metasp ...

随机推荐

  1. 使用 useLazyAsyncData 提升数据加载体验

    title: 使用 useLazyAsyncData 提升数据加载体验 date: 2024/7/19 updated: 2024/7/19 author: cmdragon excerpt: 摘要: ...

  2. 网络基础 CAS协议学习总结

    架构介绍 系统组件 CAS服务器和客户端构成了CAS系统体系结构的两个物理组件,它们通过各种协议进行通信. CAS服务器 CAS服务器是基于Spring Framework构建的Java servle ...

  3. SpringBoot+ Sharding Sphere 轻松实现数据库字段加解密

    一.介绍 在实际的软件系统开发过程中,由于业务的需求,在代码层面实现数据的脱敏还是远远不够的,往往还需要在数据库层面针对某些关键性的敏感信息,例如:身份证号.银行卡号.手机号.工资等信息进行加密存储, ...

  4. android 点击退出按钮 结束所有的activity 回到手机主页面

    android 点击退出按钮 结束所有的activity 回到手机主页面我 实现了回到主页面 但是在点击这个程序 他还是回到**退出的界面 ** 我要实现点击按钮回到手机主页面 在点击这个程序后就重新 ...

  5. js实现动态表格的添加

    <!DOCTYPE html> <html lang="en"> <head> <title>Table_Simple CSS fo ...

  6. 【DataBase】MySQL 26 存储过程

    一.概述 存储过程&函数,类似编程语言的方法 什么是方法? 完成特定功能的一组语句 方法的特点 1.可重用性 2.简化操作 二.存储过程[ Stored Procedures]: 一组预先编译 ...

  7. 【Project】原生JavaWeb工程 03 单表的业务功能

    年级表效果图样例: 可以看到主要分为以下这些功能: 功能一:展示年级列表 功能二:每个年级都具备修改和删除 功能三:添加一个年级 功能四:对多个年级选中删除,也可以全选删除,或者反选删除 功能五:根据 ...

  8. 【FastDFS】06 SpringBoot实现上传

    创建SpringBoot工程: 再导入所需要的依赖: <dependency> <groupId>net.oschina.zcx7878</groupId> < ...

  9. 国产AI训练卡,对标美国NVIDIA公司的A100,华为昇腾Atlas 300T A2(Ascend 910B4)高性能GPU/NPU/AI推理/国产计算/信创训练卡 —— 电商平台已开售

    China has successfully achieved the localization of AI chips, breaking through the technological res ...

  10. 两个 RTX2070 super 显卡 可不可以通过 nvlink交换机 进行P2P通信 呢? (答案: 可以)

    以前转载了一篇文章:    https://www.cnblogs.com/devilmaycry812839668/p/12370685.html 对于里面的结果总感觉有所怀疑,于是斥巨资购入两个 ...