Qt Charts概述

Qt Charts模块是一组易于使用的图标组件,它基于Qt的Graphice View架构,其核心组件是QChartViewQChartQChartView的父类是QGraphicsView,就是Graphics View架构中的视图组件,所以,QChartView是用于显示图标的视图。

QChart的继承关系如图:

可以看到,QChart是从QGraphicsItem继承而来的,所以,QChart是一种图形像。

QPolarChart是用于绘制极坐标图的图表类,它从QChart继承而来。

想要使用Qt Charts模块,必须在项目的配置文件重添加模块。

Plain Text 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 
    Chart* 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是封装了图例控制功能的类,可以为每个序列设置图例中的文字,可以控制图例显示在图表的上、下、左、右不同位置。