Qt Charts概述
Qt Charts
模块是一组易于使用的图标组件,它基于Qt的Graphice View
架构,其核心组件是QChartView
和QChart
。QChartView
的父类是QGraphicsView
,就是Graphics View
架构中的视图组件,所以,QChartView
是用于显示图标的视图。
QChart的继承关系如图:
可以看到,QChart
是从QGraphicsItem
继承而来的,所以,QChart
是一种图形像。
QPolarChart
是用于绘制极坐标图的图表类,它从QChart
继承而来。
想要使用Qt Charts
模块,必须在项目的配置文件重添加模块。
Qt += charts
在需要使用QtCharts的类的头文件或者源文件中,需要使用如下的包含语句:
#include <QtCharts>
using namespace QtCharts;
或者可以使用宏定义:
#include <QtCharts>
Qt_CHARTS_USE_NAMESPACE
简单的QChart绘图程序
首先用一个简单的例子来说明QChart绘图的基本原理。创建一个基于QMainWindow的应用程序,主窗口上不防止任何组件。在主窗口类中只定义一个createChart()函数,在主窗口的构造函数中调用此函数,如下:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);createChart();
}
createChart()函数用于创建图表,代码如下:
void MainWindow::createChart()
{// 创建图表QChartView* chartView = new QChartView(this); // 创建 ChartViewQChart* chart = new QChart(); // 创建 chartchart->setTitle("简单函数曲线");chartView->setChart(chart); // Chart添加到ChartViewthis->setCentralWidget(chartView);// 创建折线序列QLineSeries* series0 = new QLineSeries();QLineSeries* series1 = new QLineSeries();series0->setName("Sin");series1->setName("Cos");chart->addSeries(series0);chart->addSeries(series1);// 序列添加数值qreal t = 0, y1, y2, intv = 0.1;int cnt = 100;for (int i = 0; i < cnt; i++) {y1 = qSin(t);series0->append(t, y1);y2 = qSin(t + 20);series1->append(t, y2);t += intv;}// 创建坐标值QValueAxis* axisX = new QValueAxis();axisX->setRange(0, 10);axisX->setTitleText("time(secs)");QValueAxis* axisY = new QValueAxis();axisY->setRange(-2, 2);axisY->setTitleText("value");chart->setAxisX(axisX, series0);chart->setAxisY(axisY, series0);chart->setAxisX(axisX, series1);chart->setAxisY(axisY, series1);
}
在createChart()函数中,首先创建一个QChartView对象chartView,再创建一个QChart对象chart,将chart在chartVIew里显示,使用下面这行语句:
chartView->setChart(chart);
图表上用于显示数据的称为序列(series),这里使用折线序列QLineSeries,创建了两个QLineSeries类型的序列,并且将序列添加到chart中。
chart->addSeries(series0);
chart->addSeries(series1);
序列存储用来显示数据,所以需要为直线序列添加平面数据点的坐标数据。程序将生成正弦和余弦函数的数据作为序列数据。
序列好需要坐标轴,创建QValueAxis类型的坐标轴作为图表的X轴和Y轴,调用QChart的setAxisX()和setAxisY()函数为两个序列分别设置X轴和Y轴。
图表的主要组成部分
QChartView的功能
QChartView是QChart的视图组件,类似Graphics View架构中的QGraphicsView。实际上,在窗口设计界面上使用QChartView时,就是先放置一个QGraphicsView组件,然后升级为QChartView。
QChartView类定义的函数很少,只有下面几个。
-
void setChart(QChart* chart)
,设置一个QChart对象作为显示的图表。 -
QChart* chart()
,返回QChartView当前设置的QChart类对象。 -
void setRubberBand(RubberBands &rubberBand)
,设置选择框的类型,即鼠标在视图组件上拖动选择范围的方式,是一个QChartView::RubberBand
枚举类型的组合,QChartView::RubberBand
枚举类型有以下几种取值:-
QChartView::NoRubberBand
:无选择框; -
QChartView::VerticalRubberBand
:垂向选择; -
QChartView::HorizontalRubberBand
:水平选择; -
QChartView::RectangleRubberBand
:矩形框选择。
-
-
RubberBands rubberBand()
,返回设置的选择框类型。
序列
序列是数据的表现形式,上图就是两个QLineSeries类型的序列。序列的继承关系如下:
从上图可以看出序列类的继承关系,他们都是从QAbstractSeries
类继承而来。折线、光滑曲线和散点的序列是从QXYSeries
继承而来,用于绘制二维平面数据;QAbstractBarSeries
派生出柱状图、百分比柱状图和堆叠图等图标的序列;面积图、火柴盒图、饼图的序列都是直接继承于QAbstractSeries
。
坐标轴
坐标轴类 | 特点 | 用途 |
---|---|---|
QValueAxis | 数值坐标轴 | 作为数值类型数据的坐标轴 |
QCategoryAxis | 分组数值坐标轴 | 可以为数值范围设置文字标签 |
QLogValueAxis | 对数数值坐标轴 | 作为数值类型数据的对数坐标轴,可以设置对数的基 |
QBarCategoryAsix | 类别坐标轴 | 用字符串作为坐标轴的刻度,用于图表的非数值坐标轴 |
QDateTimeAxis | 日志时间坐标轴 | 作为日期时间数据的坐标轴 |
图例
图例(Legend)是对图表上显示的序列的示例说明,有线条颜色和文字说明。QLegend是封装了图例控制功能的类,可以为每个序列设置图例中的文字,可以控制图例显示在图表的上、下、左、右不同位置。