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); // 创建 ChartView
QChart* chart = new QChart(); // 创建 chart
chart->setTitle("简单函数曲线");
chartView->setChart(chart); // Chart添加到ChartView
this->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是封装了图例控制功能的类,可以为每个序列设置图例中的文字,可以控制图例显示在图表的上、下、左、右不同位置。