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

简介

本文将介绍支持GPU图形硬件加速的QT数据可视化框架编程实战之三维散点图从入门到精通_补天云QT技术培训专家。本文将创建一个含有三个序列的三维散点图,同时设定了坐标轴的标题和标签,使得用户点击表示三维散点的球体时,可以显示出该点的一些信息。

正文

QT三维散点图数据类型

Q3DScatter

QT数据可视化框架整体上就是支持基于OpenGL的GPU图形硬件加速的性能优化功能,QT三维散点图也是支持GPU硬件加速的。

QT数据可视化框架中的三维散点图类型是Q3DScatter类型。这个类型也是从抽象图类型QAbstract3DGraph派生而来的,因此与Q3DBars类型一样,Q3DScatter类型也是一个QWindow窗口类型。

QT三维散点图也有三个坐标轴axisX,axisY,axisZ。只是跟QT三维柱状图不同,QT三维散点图的每一个坐标轴都是数值类型的坐标轴,也就是QValue3DAxis类型。


axisX : QValue3DAxis*
axisY : QValue3DAxis*
axisZ : QValue3DAxis*


Q3DScatter类型提供了以下共有函数来实现三维散点图的维护管理。

```cpp
 //构造函数
 QScatter3DSeries(QObject *parent = nullptr)
 QScatter3DSeries(QScatterDataProxy *dataProxy, QObject *parent = nullptr)
 //析构函数
 virtual ~QScatter3DSeries()
 
 //获取和设置散点图数据代理对象的指针
 QScatterDataProxy *dataProxy() const
 void setDataProxy(QScatterDataProxy *proxy)
 
 //获取和设置点的大小,也就是表示点的球体的大小
 //点的大小是一个相对数值。
 //取值范围:[0.0, 1.0],默认0.0。
 float itemSize() const
 void setItemSize(float size)

 //获取和设置选中的条目(数据点,球体)的序号
 //一个序列中可以有N个数据点
 int selectedItem() const
 void setSelectedItem(int index)
 

# QScatter3DSeries

QT三维散点图的序列类型QScatter3DSeries类型,也是从抽象三维序列类型QAbstract3DSeries派生而来的,这个跟QT三维柱状图相似。

具体添加序列上的数据时,QT三维散点图的序列使用的类型是通过QT散点数据代理类型QScatterDataProxy来维护管理的。具体来讲就是通过QScatterDataItem来添加一个三维点,实际表现为一个三维球体;或者通过QScatterDataArray来添加一组三位点,实际表现为一系列三维球体。
QScatterDataProxy类型提供了以下共有函数来实现数据点的维护管理。

```cpp
 
 //构造函数和析构函数
 QScatterDataProxy(QObject *parent = nullptr)
 virtual ~QScatterDataProxy()

 //添加一个或多个数据点(球体)
 int addItem(const QScatterDataItem &item)
 int addItems(const QScatterDataArray &items)
 void insertItem(int index, const QScatterDataItem &item)
 void insertItems(int index, const QScatterDataArray &items)

  //设置指定序号的数据点
 void setItem(int index, const QScatterDataItem &item)
 void setItems(int index, const QScatterDataArray &items)

//获取序列中的一组数据点或者一个数据点
 const QScatterDataArray *array() const
 const QScatterDataItem *itemAt(int index) const

 //获取数据点的数量
 int itemCount() const

 //删除指定序号的数据点
 void removeItems(int index, int removeCount)
 void resetArray(QScatterDataArray *newArray)

 //获取这个代理对象对应的序列对象的指针
 QScatter3DSeries *series() const

QT三维散点图运行效果

这个三维散点图应用实例运行效果截图如下所示。

在这里插入图片描述

本文对应的视频演示如下所示:

支持GPU图形硬件加速的QT数据可视化框架编程实战之三维散点图从入门到精通

视频链接如下所示:

支持GPU图形硬件加速的QT数据可视化框架编程实战之三维散点图从入门到精通

QT三维散点图应用实例源码

这个三维散点图应用实例的源码如下所示:

//补天云QT免费课程 面试必备界面美化 性能优化 原理源码。
#include "butianyunwidget.h"
#include <Q3DScatter>
#include <QScatter3DSeries>
#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数据可视化框架的三维散点图
    Q3DScatter* scatter = new Q3DScatter(nullptr);
    scatter->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
    scatter->setFlags(scatter->flags() | Qt::FramelessWindowHint);

    //X轴的标题
    scatter->axisX()->setRange(0, 100);
    scatter->axisX()->setTitleVisible(true);
    scatter->axisX()->setTitle(QStringLiteral("X轴"));
    scatter->axisX()->setLabelFormat(QStringLiteral("%.0f 公里"));

    //Z轴的标题
    scatter->axisZ()->setRange(0, 100);
    scatter->axisZ()->setTitleVisible(true);
    scatter->axisZ()->setTitle(QStringLiteral("Z轴"));
    scatter->axisZ()->setLabelFormat(QStringLiteral("%.0f 公里"));

    //Y轴(高)的标题
    scatter->axisY()->setRange(0, 100);
    scatter->axisY()->setTitleVisible(true);
    scatter->axisY()->setTitle(QStringLiteral("Y轴"));
    scatter->axisY()->setLabelFormat(QStringLiteral("%.0f 公里"));

    //三个序列的颜色
    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++)
    {
        QScatter3DSeries* series = new QScatter3DSeries();
        series->setName(names[i]);
        series->setBaseColor(colors[i]);
        series->setItemLabelFormat((QStringLiteral("@seriesName (@xLabel, @zLabel) =>  @yLabel)")));
        QScatterDataArray data;
        data << QVector3D(10 + i * 10, 10 + i * 20, 10 + i * 30)
             << QVector3D(20 + i * 30, 20 + i * 20, 20 + i * 10)
             << QVector3D(30 + i * 10, 30 + i * 10, 30 + i * 10);
        series->dataProxy()->addItems(data);
        scatter->addSeries(series);
    }

    //创建一个包含三维散点图的QT窗口
    QWidget* scatter_widget = QWidget::createWindowContainer(scatter);
    main_layout->addWidget(scatter_widget);

    //按钮控件
    QPushButton* button_b = new QPushButton(QStringLiteral("补天云QT技术培训专家"));
    main_layout->addWidget(button_b);
}

总结

本文介绍了支持GPU图形硬件加速的QT数据可视化框架编程实战之三维散点图从入门到精通_补天云QT技术培训专家。本文介绍的应用实例中创建了一个含有三个序列的三维散点图,同时设定了坐标轴的标题和标签,使得用户点击表示三维散点的球体时,可以显示出zh该点的一些信息。

posted @ 2023-07-30 14:25  QT界面美化性能优化  阅读(273)  评论(0编辑  收藏  举报  来源