重学Qt——数据可视化

数据可视化

Qt Charts

Qt Charts模块简介

Qt Charts模块是Qt框架中一组易于使用的图表组件,它基于Qt的图形/视图架构。该模块提供了丰富的图表类型和功能,可以帮助开发者快速创建各种图表应用。

核心组件概述

  1. QChartView:作为图表的视图组件,QChartView负责图表的显示。它是QGraphicsView的子类,利用图形/视图架构实现图表的绘制和展示。
  2. QChart:QChart是图表的核心类,从QGraphicsItem继承而来,代表了一种图形项,负责图表数据的组织和表现。
  3. 特定类型图表类:如QPolarChart,用于绘制极坐标图,从QChart继承而来,提供了极坐标图表的特殊功能和表现。

如何在项目中使用Qt Charts模块

要在项目中使用Qt Charts模块,需要在项目的配置文件(.pro文件)中添加指定语句,以告诉编译器包含该模块。具体操作如下:

在项目的.pro文件中增加一行语句:QT+=charts。这样,编译器在编译项目时就会包含Qt Charts模块,从而可以使用其中的图表组件。

在需要使用Qt Charts模块中的类的头文件或源程序文件中可以使用如下的包含语句:

plain 复制代码
#include <Qtcharts>

图表主要组成部分

概述

Qt Charts模块是一组用于创建图表的组件,它基于Qt的图形/视图架构。该模块提供了丰富的图表类型和功能,使得开发者可以快速、方便地创建出专业的图表应用。

核心组件详解

QChartView

QChartView是QChart的视图组件,负责图表的显示。它是QGraphicsView的子类,用于在界面上可视化地展示图表。在设计窗口界面时,通常先放置一个QGraphicsView组件,然后将其提升为QChartView类。

QChart

QChart是图表的核心组件,从QGraphicsItem继承而来,用于管理图表中各种元素,如序列、坐标轴、图例等。它可以被看作是图形/视图架构中的图形项,负责组织和表现图表数据。

序列(Series)

序列是图表中数据的展现形式。Qt Charts模块提供了多种序列类,如QLineSeries(折线序列)、QBarSeries(柱状图序列)等。这些序列类用于存储序列的数据和属性,不同的序列类决定了图表的类型和表现形式。

坐标轴

坐标轴是图表中用于表示数据变化的轴线。Qt Charts模块提供了QValueAxis(数值坐标轴)和QLogValueAxis(对数坐标轴)等不同类型的坐标轴,以满足不同类型图表的需求。

图例

图例是图表上展示序列的示例说明,包括线条颜色和文字说明。

QLegend是一个封装了图例功能的类,它在QChart对象中添加序列后会自动生成图例,可以为每个序列设置图例中的文字,并且可以控制图例在图表中的位置,例如上、下、左、右不同位置

工作原理

QChartView作为视图组件,负责将QChart中的图表数据通过图形/视图架构进行绘制和展示。QChart管理图表中的各种元素,包括序列、坐标轴、图例等,将这些元素组织起来形成完整的图表。序列类负责存储序列的数据和属性,不同的序列类决定了图表的类型和表现形式。坐标轴则用于表示数据的变化,提供数值或对数等不同类型的坐标轴。

示例:通过QChartView在界面上展示出折线图

  1. 在创建一个折线图时,首先创建QLineSeries对象来存储折线数据,创建QChart对象并添加QLineSeries对象作为其序列。
  2. 创建QChartView对象并将QChart对象设置为其模型
  3. 将QChartView添加到界面中。
cpp 复制代码
#include <QApplication>
#include <QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QChart>


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QT_USE_NAMESPACE
    // 创建一个 QLineSeries 用于存储数据点
    QLineSeries *series = new QLineSeries();
    series->append(0, 0);
    series->append(1, 1);
    series->append(2, 4);
    series->append(3, 9);
    series->append(4, 16);
    series->append(5, 25);

    // 创建一个 QChart 对象并将 QLineSeries 添加至其中
    QChart *chart = new QChart();
    chart->addSeries(series);
    chart->setTitle("Simple Line Chart");
    chart->setAnimationOptions(QChart::SeriesAnimations);

    // 设置默认坐标轴
    chart->createDefaultAxes();

    // 创建一个 QChartView 并设置 QChart 对象为其模型
    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);

    // 创建一个 QMainWindow 并在其中显示 QChartView
    QMainWindow window;
    window.setCentralWidget(chartView);
    window.resize(400, 300);
    window.show();

    return app.exec();
}

运行结果:


坐标轴详解

在 Qt Charts 中,坐标轴类主要用于定义图表的坐标系统,帮助用户更直观地理解数据的分布和趋势。坐标轴类提供了灵活的配置选项,可以高度自定义轴的外观和行为。

QAbstractAxis

QAbstractAxis类的父类是QObject,所以坐标轴类不是可见的组件类,而是封装了坐标轴相关的各种数据和属性,如坐标轴的刻度、标签、网格线、标题等。

主要坐标轴类

QValueAxis

  • 用于表示数值型数据的轴。
  • 提供了刻度、范围和格式化选项。
  • 适合用于折线图、柱状图等需要数值坐标的图表。

QCategoryAxis

  • 用于表示分类数据的轴。
  • 可以将类别标签映射到数值,这对饼图和柱状图特别有用。

QDateTimeAxis

  • 用于表示时间序列数据的轴。
  • 可以处理日期和时间,适用于时间相关的数据展示。

QLogValueAxis

  • 用于表示对数值数据的轴。
  • 适合处理数量级跨度较大的数据,如金融数据。

QColorAxis

  • QColorAxis允许将数据值映射到颜色范围,帮助用户识别数据模式及趋势。
  • 可以自定义颜色范围和渐变,以适应不同的视觉需求。
  • 可以与数值轴(如QValueAxis)一起使用,以便更好地展示多维数据。

图表交互动作

QLegendMarker

图的种类

主要窗口设计和初始化

图表种类:

  • 折线图绘制
  • 柱状图
  • 堆叠柱状图
  • 百分比柱状图
  • 饼图

三维图形

Data Visualization模块

一、概述

Qt Data Visualization模块是Qt提供的一个用于创建三维图形的库。它允许开发者在项目中轻松添加三维柱状图、三维散点图、三维曲面等高级图形显示功能。该模块基于图形/视图架构,与Qt Charts模块类似,但专注于三维图形的展示。

二、模块配置与包含

要在项目中使用Data Visualization模块,需要在项目配置文件(.pro文件)中添加QT+=datavisualization语句。在需要使用该模块中的类的文件中,应包含头文件,以便访问模块中的大部分常用类。若编译时提示缺少某个类,则需单独包含该类对应的头文件。

三、三维图形类

Data Visualization模块提供了三种三维图形类:Q3DBars(三维柱状图)、Q3DScatter(三维散点图)和Q3DSurface(三维曲面)。这些类从QWindow继承,因此它们与QWidget不同,不能直接在一般的QWidget组件上显示。每种三维图形类对应一种特定的三维序列,用于存储和展示数据。

四、序列与数据代理

  1. 序列
    • 每种三维图形类都有其专用的序列类,如Q3DBars使用QBar3DSeries,Q3DScatter使用QScatter3DSeries,Q3DSurface使用QSurface3DSeries。
    • 序列类用于存储图形的数据点,并决定了数据的展示方式。
    • 不同类型的序列类存储数据的结构也不同,例如QScatter3DSeries存储三维数据点的坐标,而QSurface3DSeries存储的数据在水平面上呈网格状分布。
  2. 数据代理
    • 数据代理类与序列对应,用于存储序列的数据。
    • 所有数据代理类都继承自QAbstractDataProxy,并且每种序列都有一个基于项数据模型的数据代理子类。
    • 对于QSurface3DSeries,还有一个特殊的数据代理类QHeightMapSurfaceDataProxy,它能够将图片表示的高程数据显示为三维曲面,特别适用于地图高程数据的展示。

五、坐标轴

Data Visualization模块提供了两种三维坐标轴类:QValue3DAxis(数值型坐标轴)和QCategory3DAxis(文字型坐标轴)。它们都继承自QAbstract3DAxis,为三维图形提供了灵活的坐标轴设置。

六、实例说明

以创建三维曲面图为例,开发者首先需要创建Q3DSurface对象作为图形容器,然后创建QSurface3DSeries对象作为序列,并添加数据点。接着,可以使用QHeightMapSurfaceDataProxy来将图片的高程数据转换为三维曲面。最后,将Q3DSurface添加到界面中,即可展示三维曲面图。

三维柱状图

Q3DBars
QBar3DSeries
QBarDataProxy

存储和管理三维柱状图关联的数据、行标签和列标签。

函数

函数名 描述
int addRow 添加一行到三维柱状图中。
void insertRow 在指定位置插入一行到三维柱状图中。
void removeRows 从三维柱状图中移除一行或多行。
void setRow 设置三维柱状图中的某一行的数据或属性。
QBarDataRow *rowAt 返回三维柱状图中指定位置的行。
void setItem 设置三维柱状图中某个数据项的值或属性。
QBarDataItem *itemAt 返回三维柱状图中指定位置的数据项。
void resetArray 重置三维柱状图的数据数组,可能是清除所有数据或恢复到初始状态。
int rowCount 获取三维柱状图中的行数。
void setRowLabels 设置三维柱状图中行的标签。
QStringList rowLabels 获取三维柱状图中所有行的标签。
void setColumnLabels 设置三维柱状图中列的标签。
QStringList columnLabels 获取三维柱状图中所有列的标签。

三维散点图

QScatterDataProxy

要绘制三维散点图,需要用到三维图形类Q3DScatter、序列类QScatter3DSeries和数据代理类QScatterDataProxy。

三维曲面图

绘制三维曲面图需要使用Q3DSurface图形类和QSurface3DSeries序列类,根据使用的数据代理类不同,可以绘制两种三维曲面图。

QSurfaceDataProxy

QSurfaceDataProxy 数据代理类,根据空间点的三维坐标绘制曲面,例如一般的三维函数曲面。

函数

函数名 描述
addRow(QSurfaceDataRow *row) 向三维柱状图的数据结构中添加一行数据。
insertRow(int rowIndex, QSurfaceDataRow *row) 在指定的行索引处插入一行数据。
removeRows(int rowIndex, int removeCount) 从三维柱状图中移除指定行数的数据。
setRow(int rowIndex, QSurfaceDataRow *row) 设置三维柱状图中指定行的数据。
setItem(int rowIndex, int columnIndex, QSurfaceDatalterm &item) 设置三维柱状图中指定行和列的数据项。
resetArray(QSurfaccDataArray *newArray) 重置三维柱状图的数据数组。注意:此函数中的QSurfaccDataArray可能是拼写错误,通常应该是QSurfaceDataArray。
QSurfaceDataArray *arrayo 可能是一个指向QSurfaceDataArray的指针,用于访问或修改三维柱状图的数据数组。注意:这可能是一个变量声明,不是函数。
int rowCount 获取三维柱状图中的行数。这可能是一个成员变量而不是函数。
int columnCount 获取三维柱状图中的列数。同样,这可能是一个成员变量。
QSurfaceDataItem *itemAt(int rowIndex, int columnIndex) 获取指定行和列的数据项。
QSurfaceDataItem *itemAt(QPoint &position) 通过给定的坐标(使用QPoint)获取数据项。这可能是三维柱状图的二维表示(如热力图)中的函数。

QHeightMapSurfaceDataProxy数据代理类,根据一张图片的数据绘制三维曲面,典型的如三维地形图。

相关推荐
努力努力再努力wz3 小时前
【Qt入门系列】:按钮组件全解析:从 QAbstractButton 到快捷键事件、单选与复选机制
c语言·开发语言·数据结构·c++·git·qt·github
奇树谦4 小时前
QML 开发前端界面详解:从入门到示例实战
qt
我在人间贩卖青春5 小时前
重学Qt——网络编程
qt
caicai_xiaobai9 小时前
Notepad++手动安装 Hex-Editor 插件
qt
郝学胜-神的一滴10 小时前
Qt 高级开发 015:C++ 原生实现信号槽机制
开发语言·c++·qt·软件构建·用户界面
sycmancia13 小时前
Qt——查找对话框的功能实现
开发语言·qt
x秀x13 小时前
双击EXE启动程序,出现QT动态链接库报错,解决方法
开发语言·qt
尤老师FPGA16 小时前
QT下载与安装
开发语言·qt
奇树谦16 小时前
深入理解 Qt 插件系统:原理、实现与实践
qt