Qt 统计图编程

学习目标:Qt 折线图,柱形图和扇形统计图编程

学习基础

Qt QChart 曲线图表操作-CSDN博客

学习内容

Qt中绘制三种常见的图表非常方便, 主要步骤如下:

  1. 折线图:
  • 使用QLineSeries定义折线数据,添加多个坐标点

  • 使用QValueAxis创建X轴和Y轴

  • 将系列和坐标轴添加到QChart中

  • 设置属性如标题、线条样式等

  • 添加到QChartView显示

  1. 柱形图:
  • 使用QBarSet定义每个组的柱数据

  • 使用QBarSeries添加多个QBarSet组成总系列

  • 同样创建分类轴和值轴

  • 可以采用堆积方式显示

  • 其他设置与折线图类似

  1. 饼图:
  • 使用QPieSeries定义饼图序列

  • 通过QPieSlice添加多个扇形部分

  • 设置每个扇形的名称、百分比和颜色

  • 添加到QChart并使用QChartView显示

  • 可以手动修改扇形的开始和长度Angle

Qt Chart提供了很友好的接口实现各种常见图表。开发者只需熟悉这几个关键类,就可以方便绘制不同需求的图表。它使用户界面的数据可视化开发工作效率得到很大提升。

话不多说直接开始上代码

项目效果

核心代码

折线图

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建图表
    QChart* chart =new QChart;
    chart->setTitle("全球各国军费增长折线图"); // 设置标题名称
    ui->graphicsView->setChart(chart);

    //设置坐标
    QValueAxis* ax =new QValueAxis;
    ax->setTitleText("年份");
    ax->setRange(2018,2022);
    ax->setTickCount(5); //设置刻度 即年份总个数
    ax->setLineVisible(true); //网格
    ax->setGridLineVisible(true);//网格线均可见

    QValueAxis *ay =new QValueAxis;
    ay->setTitleText("军费(万亿)");
    ay->setRange(3000,10000);
    ay->setTickCount(5);
    ay->setLineVisible(true);
    ay->setGridLineVisible(true);

    //绘画折线
    QLineSeries* series =new QLineSeries;
    series->setName("中国");
    series->setColor(Qt::red);
    // 添加数据点到序列
    series->append(2018,6500);
    series->append(2019,4900);
    series->append(2020,8000);
    series->append(2021,9000);
    series->append(2022,9500);

    QLineSeries* series2 =new QLineSeries;
    series2->setName("俄罗斯");
    series2->setColor(Qt::green);
    // 添加数据点到序列
    series2->append(2018,4500);
    series2->append(2019,4900);
    series2->append(2020,9000);
    series2->append(2021,10000);
    series2->append(2022,10000);

    //加入到图表
    chart->addSeries(series);
    chart->setAxisX(ax,series);
    chart->setAxisY(ay,series);

    chart->addSeries(series2);
    chart->setAxisX(ax,series2);
    chart->setAxisY(ay,series2);
}

Widget::~Widget()
{
    delete ui;
}

柱形图

cpp 复制代码
#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    //创建图表
    QChart * chart =new QChart;
    chart->setTitle("某某学校实验班高考成绩分数");


    //创建条形对象数据
    QBarSet* bar =new QBarSet("bar");
    *bar<<560<<710<<599<<688<<701;

    //绘画条形
    QStackedBarSeries* series =new QStackedBarSeries;
    series->append(bar);



    QStringList strlist={"小王","小李","小吴","小张","小赵"};

    //创建x y轴 通过QBarCategoryAxis类将类型添加到图表的轴
    QBarCategoryAxis* ax =new QBarCategoryAxis;
    ax->setTitleText("考生姓名");
    ax->append(strlist);

    QValueAxis* ay =new QValueAxis;
    ay->setTitleText("高考总分阶梯");
    ay->setRange(0,750);



    chart->addSeries(series);
    chart->addAxis(ax,Qt::AlignBottom);
    chart->addAxis(ay,Qt::AlignLeft);

    series->attachAxis(ax);
    series->attachAxis(ay);

    chart->legend()->setVisible(false); // 设置绘图区与图表边界
    chart->legend()->setAlignment(Qt::AlignBottom);

    QChartView* view = new QChartView;
    view->setChart(chart);

    w.setWindowTitle("高考成绩--柱状图表展示");
    w.setCentralWidget(view);
    w.resize(800,500);

    w.show();


    return a.exec();
}

饼形图

cpp 复制代码
#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    //创建饼状图绘画对象
    QPieSeries* series =new QPieSeries;
    // 占用比例
    series->append("70分以下:30%",30);
    series->append("70分-85分:40%",40);
    series->append("86分-99分:25%",25);
    series->append("100分:5%",5);
    series->setLabelsVisible(true);// 设置标签属性,可见

    QPieSlice* s1=series->slices().at(0);
    QPieSlice* s2=series->slices().at(1);
    QPieSlice* s3=series->slices().at(2);
    QPieSlice* s4=series->slices().at(3);

    s1->setColor(Qt::red);
    s2->setColor(Qt::green);
    s3->setColor(Qt::yellow);
    s4->setColor(Qt::black);

    //创建图表
    QChart* chart =new QChart;
    chart->addSeries(series);
    chart->setTitle("饼图形状--班级考试百分制整数比例");

    //创建图表视图
    QChartView* view =new QChartView;
    view->setChart(chart);


    w.setCentralWidget(view);
    w.resize(600,600);

    w.show();
    return a.exec();
}

总结

总的来说,通过这个示例可以很清楚地了解QT中的图表绘制过程:

  1. 首先创建相应的图表对象,如QLineChart、QBarChart、QPieChart等。设置标题、属性等。

  2. 定义数据模型,如QLineSeries、QBarSeries、QPieSeries等,用于存储图表的数据点。

  3. 添加具体的数据到系列对象中,如坐标点、分类数据、占比等。

  4. 创建坐标轴对象QValueAxis和QCategoryAxis,配置名称、范围等。

  5. 将系列与坐标轴添加到图表对象中,实现数据与轴的关联。

  6. 创建QChartView视图对象,设置图表给视图即可渲染展示。

  7. 另外可以对分量设置个性化属性,如颜色、标签等。

通过极少量API调用,就可以绘制出丰富的线性图、柱状图、饼图等不同图表类型。这说明QT Chart的设计理念非常清晰、使用也很简单易上手。开发人员可以根据实际需求,通过组合这些基础类快速实现各种数据可视化工作。这无疑大大提升了开发效率。

最后附上源代码链接

对您有帮助的话,帮忙点个star

Qt demo: 学习qt过程 (gitee.com)

相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能14 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
sugar__salt14 天前
从网页小游戏到数据可视化:掌握 HTML5 Canvas 核心能力
前端·信息可视化·html5