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. windows下mysql服务局域网访问配置

    在局域网中访问本机(Windows)的MySQL服务器,需要确保MySQL服务器配置为允许远程访问,并且防火墙设置允许外部连接.以下是详细的步骤: 1. 修改MySQL配置文件允许远程访问 找到并编辑 ...

  2. PHP数组遍历的四种方法

    PHP数组循环遍历的四种方式   [(重点)数组循环遍历的四种方式] 1,https://www.cnblogs.com/waj6511988/p/6927208.html 2,https://www ...

  3. 【Spring-Security】Re13 Oauth2协议P3 整合JWT

    视频地址: https://www.bilibili.com/video/BV12D4y1U7D8?p=44 有用到Redis存储JWT,头疼每次找Windows版的 https://github.c ...

  4. 蔡磊公布渐冻症诊断报告 5月住进ICU一度考虑气切

    原文地址: https://baijiahao.baidu.com/s?id=1801485780372006198

  5. 很好用的python游戏环境:强化学习算法走迷宫游戏环境(导航问题 navigation):分享一个python语言的迷宫游戏环境

    项目的GitHub地址(作者:莫凡): https://github.com/MorvanZhou/mmaze 运行的示例代码: import mmaze start = (0, 0) end = ( ...

  6. 【转载】 tensorflow gfile文件操作详解

    原文地址: https://zhuanlan.zhihu.com/p/31536538 -------------------------------------------------------- ...

  7. Jax的加速层的伪代码/中间层代码的生成和查看

    地址: https://jax.readthedocs.io/en/latest/notebooks/thinking_in_jax.html#jit-mechanics-tracing-and-st ...

  8. 图片热区。vue3+ts和vue3+js写法(js没写完数据,功能完善)

    废话不多说,上代码 vue3+ts <!-- 热区组件 --> <template> <el-dialog v-model="dialog_visible&qu ...

  9. 10W数据量导入与现有表数据去重

    使用的是PostgreSQL 在做大数据量(十万级)导入时,某些字段和数据库表里数据(千万级)重复的需要排除掉,把表数据查询出来用程序的方式判断去重效率很低,于是考虑用临时表. 先把新数据插入到临时表 ...

  10. 4. 从0开始学ARM-ARM指令,移位、数据处理、BL、机器码

    <到底什么是Cortex.ARMv8.arm架构.ARM指令集.soc?一文帮你梳理基础概念[科普]> 关于ARM指令用到的IDE开发环境可以参考下面这篇文章 <1. 从0开始学AR ...