QChart Class Reference

QChart 是 Qt 框架中用于绘制图表的类,属于 Qt Charts 模块。它提供了一种简单而强大的方式来创建各种类型的图表,如折线图、柱状图、饼图、散点图等。QChart 可以与 QChartView 结合使用,将图表嵌入到应用程序的 GUI 中。


QChart 的核心功能

  1. 多种图表类型
    • 支持折线图、柱状图、饼图、散点图、面积图等多种图表类型。
  2. 数据管理
    • 通过 QAbstractSeries 的子类(如 QLineSeriesQBarSeries 等)管理图表的数据。
  3. 轴管理
    • 支持数值轴(QValueAxis)、分类轴(QCategoryAxis)和日期时间轴(QDateTimeAxis)。
  4. 图例
    • 自动生成图例,并支持自定义图例的位置和样式。
  5. 标题和标签
    • 可以设置图表的标题、轴标签等。
  6. 交互功能
    • 支持缩放、平移、工具提示等交互功能。
  7. 样式和主题
    • 支持自定义图表的颜色、字体等样式,以及预定义的主题(如 QChart::ChartThemeLight)。

QChart 的主要组件

  1. QAbstractSeries
    • 图表数据系列的基类,具体实现包括:
      • QLineSeries:折线图。
      • QBarSeries:柱状图。
      • QPieSeries:饼图。
      • QScatterSeries:散点图。
      • QAreaSeries:面积图。
  2. QAbstractAxis
    • 图表的轴基类,具体实现包括:
      • QValueAxis:数值轴。
      • QCategoryAxis:分类轴。
      • QDateTimeAxis:日期时间轴。
  3. QChartView
    • 用于显示图表的视图组件,可以将 QChart 嵌入到 GUI 中。
  4. QLegend
    • 图表的图例,用于标识数据系列。

QChart 的常用方法

  1. 添加数据系列
    • addSeries(QAbstractSeries *series):向图表中添加一个数据系列。
  2. 设置轴
    • addAxis(QAbstractAxis *axis, Qt::Alignment alignment):向图表中添加一个轴。
    • setAxisX(QAbstractAxis *axis, QAbstractSeries *series):为指定系列设置 X 轴。
    • setAxisY(QAbstractAxis *axis, QAbstractSeries *series):为指定系列设置 Y 轴。
  3. 设置标题
    • setTitle(const QString &title):设置图表的标题。
  4. 设置图例
    • legend()->setVisible(bool visible):显示或隐藏图例。
    • legend()->setAlignment(Qt::Alignment alignment):设置图例的位置。
  5. 设置主题
    • setTheme(QChart::ChartTheme theme):设置图表的主题(如 QChart::ChartThemeLight)。
  6. 交互功能
    • setAnimationOptions(QChart::AnimationOptions options):设置动画效果。
    • setRubberBand(QChartView::RubberBand rubberBand):启用缩放或平移功能。

QChart 的使用步骤

  1. 创建一个 QChart 对象。
  2. 创建数据系列(如 QLineSeriesQBarSeries 等)并添加数据。
  3. 将数据系列添加到图表中。
  4. 创建轴(如 QValueAxisQCategoryAxis 等)并设置到图表中。
  5. 将图表添加到 QChartView 中并显示。

以下是一个完整的示例,展示如何使用 QChart 创建折线图、柱状图、饼图、散点图和面积图。每个图表都显示在一个单独的窗口中。

完整代码示例

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

QT_CHARTS_USE_NAMESPACE // 使用 Qt Charts 命名空间

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

    // 1. 折线图
    QLineSeries *lineSeries = new QLineSeries();
    lineSeries->append(0, 6);
    lineSeries->append(1, 4);
    lineSeries->append(2, 8);
    lineSeries->append(3, 4);
    lineSeries->append(4, 5);
    lineSeries->append(5, 9);

    QChart *lineChart = new QChart();
    lineChart->addSeries(lineSeries);
    lineChart->setTitle("Line Chart");

    QValueAxis *axisX = new QValueAxis();
    axisX->setRange(0, 5);
    axisX->setTitleText("X Axis");

    QValueAxis *axisY = new QValueAxis();
    axisY->setRange(0, 10);
    axisY->setTitleText("Y Axis");

    lineChart->addAxis(axisX, Qt::AlignBottom);
    lineChart->addAxis(axisY, Qt::AlignLeft);
    lineSeries->attachAxis(axisX);
    lineSeries->attachAxis(axisY);

    QChartView *lineChartView = new QChartView(lineChart);
    lineChartView->setRenderHint(QPainter::Antialiasing);
    lineChartView->resize(800, 600);
    lineChartView->setWindowTitle("Line Chart");
    lineChartView->show();

    // 2. 柱状图
    QBarSet *barSet = new QBarSet("Data");
    *barSet << 6 << 4 << 8 << 4 << 5 << 9;

    QBarSeries *barSeries = new QBarSeries();
    barSeries->append(barSet);

    QChart *barChart = new QChart();
    barChart->addSeries(barSeries);
    barChart->setTitle("Bar Chart");

    QCategoryAxis *barAxisX = new QCategoryAxis();
    barAxisX->append("Jan", 0);
    barAxisX->append("Feb", 1);
    barAxisX->append("Mar", 2);
    barAxisX->append("Apr", 3);
    barAxisX->append("May", 4);
    barAxisX->append("Jun", 5);

    QValueAxis *barAxisY = new QValueAxis();
    barAxisY->setRange(0, 10);

    barChart->addAxis(barAxisX, Qt::AlignBottom);
    barChart->addAxis(barAxisY, Qt::AlignLeft);
    barSeries->attachAxis(barAxisX);
    barSeries->attachAxis(barAxisY);

    QChartView *barChartView = new QChartView(barChart);
    barChartView->setRenderHint(QPainter::Antialiasing);
    barChartView->resize(800, 600);
    barChartView->setWindowTitle("Bar Chart");
    barChartView->show();

    // 3. 饼图
    QPieSeries *pieSeries = new QPieSeries();
    pieSeries->append("Jan", 6);
    pieSeries->append("Feb", 4);
    pieSeries->append("Mar", 8);
    pieSeries->append("Apr", 4);
    pieSeries->append("May", 5);
    pieSeries->append("Jun", 9);

    QChart *pieChart = new QChart();
    pieChart->addSeries(pieSeries);
    pieChart->setTitle("Pie Chart");

    QChartView *pieChartView = new QChartView(pieChart);
    pieChartView->setRenderHint(QPainter::Antialiasing);
    pieChartView->resize(800, 600);
    pieChartView->setWindowTitle("Pie Chart");
    pieChartView->show();

    // 4. 散点图
    QScatterSeries *scatterSeries = new QScatterSeries();
    scatterSeries->append(0, 6);
    scatterSeries->append(1, 4);
    scatterSeries->append(2, 8);
    scatterSeries->append(3, 4);
    scatterSeries->append(4, 5);
    scatterSeries->append(5, 9);

    QChart *scatterChart = new QChart();
    scatterChart->addSeries(scatterSeries);
    scatterChart->setTitle("Scatter Chart");

    QValueAxis *scatterAxisX = new QValueAxis();
    scatterAxisX->setRange(0, 5);
    scatterAxisX->setTitleText("X Axis");

    QValueAxis *scatterAxisY = new QValueAxis();
    scatterAxisY->setRange(0, 10);
    scatterAxisY->setTitleText("Y Axis");

    scatterChart->addAxis(scatterAxisX, Qt::AlignBottom);
    scatterChart->addAxis(scatterAxisY, Qt::AlignLeft);
    scatterSeries->attachAxis(scatterAxisX);
    scatterSeries->attachAxis(scatterAxisY);

    QChartView *scatterChartView = new QChartView(scatterChart);
    scatterChartView->setRenderHint(QPainter::Antialiasing);
    scatterChartView->resize(800, 600);
    scatterChartView->setWindowTitle("Scatter Chart");
    scatterChartView->show();

    // 5. 面积图
    QLineSeries *upperSeries = new QLineSeries();
    upperSeries->append(0, 6);
    upperSeries->append(1, 4);
    upperSeries->append(2, 8);
    upperSeries->append(3, 4);
    upperSeries->append(4, 5);
    upperSeries->append(5, 9);

    QLineSeries *lowerSeries = new QLineSeries();
    lowerSeries->append(0, 3);
    lowerSeries->append(1, 2);
    lowerSeries->append(2, 4);
    lowerSeries->append(3, 2);
    lowerSeries->append(4, 2.5);
    lowerSeries->append(5, 4.5);

    QAreaSeries *areaSeries = new QAreaSeries(upperSeries, lowerSeries);
    areaSeries->setName("Area Chart");

    QChart *areaChart = new QChart();
    areaChart->addSeries(areaSeries);
    areaChart->setTitle("Area Chart");

    QValueAxis *areaAxisX = new QValueAxis();
    areaAxisX->setRange(0, 5);
    areaAxisX->setTitleText("X Axis");

    QValueAxis *areaAxisY = new QValueAxis();
    areaAxisY->setRange(0, 10);
    areaAxisY->setTitleText("Y Axis");

    areaChart->addAxis(areaAxisX, Qt::AlignBottom);
    areaChart->addAxis(areaAxisY, Qt::AlignLeft);
    areaSeries->attachAxis(areaAxisX);
    areaSeries->attachAxis(areaAxisY);

    QChartView *areaChartView = new QChartView(areaChart);
    areaChartView->setRenderHint(QPainter::Antialiasing);
    areaChartView->resize(800, 600);
    areaChartView->setWindowTitle("Area Chart");
    areaChartView->show();

    return app.exec();
}

代码说明

  1. 折线图
    • 使用 QLineSeries 创建折线图,并设置 X 轴和 Y 轴。
  2. 柱状图
    • 使用 QBarSeriesQBarSet 创建柱状图,并设置分类轴和数值轴。
  3. 饼图
    • 使用 QPieSeries 创建饼图,并直接添加到图表中。
  4. 散点图
    • 使用 QScatterSeries 创建散点图,并设置 X 轴和 Y 轴。
  5. 面积图
    • 使用 QAreaSeries 创建面积图,需要提供上边界和下边界的数据系列。

运行效果

运行程序后,会显示五个窗口,分别展示:

  1. 折线图:显示一条折线。
  2. 柱状图:显示一组柱状图。
  3. 饼图:显示一个饼图。
  4. 散点图:显示一组散点。
  5. 面积图:显示一个填充区域。

总结

这个示例展示了如何使用 QChart 创建多种类型的图表。通过 QChartView,可以轻松地将图表嵌入到应用程序中。Qt Charts 模块提供了丰富的功能,适合用于数据可视化、报表生成等场景。

你可能感兴趣的:(Qt,Charts,小课堂,qt)