数据可视化
Qt Charts
Qt Charts模块简介
Qt Charts模块是Qt框架中一组易于使用的图表组件,它基于Qt的图形/视图架构。该模块提供了丰富的图表类型和功能,可以帮助开发者快速创建各种图表应用。
核心组件概述:
- QChartView:作为图表的视图组件,QChartView负责图表的显示。它是QGraphicsView的子类,利用图形/视图架构实现图表的绘制和展示。
- QChart:QChart是图表的核心类,从QGraphicsItem继承而来,代表了一种图形项,负责图表数据的组织和表现。
- 特定类型图表类:如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在界面上展示出折线图
- 在创建一个折线图时,首先创建QLineSeries对象来存储折线数据,创建QChart对象并添加QLineSeries对象作为其序列。
- 创建QChartView对象并将QChart对象设置为其模型
- 将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组件上显示。每种三维图形类对应一种特定的三维序列,用于存储和展示数据。
四、序列与数据代理
- 序列 :
- 每种三维图形类都有其专用的序列类,如Q3DBars使用QBar3DSeries,Q3DScatter使用QScatter3DSeries,Q3DSurface使用QSurface3DSeries。
- 序列类用于存储图形的数据点,并决定了数据的展示方式。
- 不同类型的序列类存储数据的结构也不同,例如QScatter3DSeries存储三维数据点的坐标,而QSurface3DSeries存储的数据在水平面上呈网格状分布。
- 数据代理 :
- 数据代理类与序列对应,用于存储序列的数据。
- 所有数据代理类都继承自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数据代理类,根据一张图片的数据绘制三维曲面,典型的如三维地形图。