学习目标:Qt 折线图,柱形图和扇形统计图编程
学习基础
学习内容
Qt中绘制三种常见的图表非常方便, 主要步骤如下:
- 折线图:
-
使用QLineSeries定义折线数据,添加多个坐标点
-
使用QValueAxis创建X轴和Y轴
-
将系列和坐标轴添加到QChart中
-
设置属性如标题、线条样式等
-
添加到QChartView显示
- 柱形图:
-
使用QBarSet定义每个组的柱数据
-
使用QBarSeries添加多个QBarSet组成总系列
-
同样创建分类轴和值轴
-
可以采用堆积方式显示
-
其他设置与折线图类似
- 饼图:
-
使用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中的图表绘制过程:
-
首先创建相应的图表对象,如QLineChart、QBarChart、QPieChart等。设置标题、属性等。
-
定义数据模型,如QLineSeries、QBarSeries、QPieSeries等,用于存储图表的数据点。
-
添加具体的数据到系列对象中,如坐标点、分类数据、占比等。
-
创建坐标轴对象QValueAxis和QCategoryAxis,配置名称、范围等。
-
将系列与坐标轴添加到图表对象中,实现数据与轴的关联。
-
创建QChartView视图对象,设置图表给视图即可渲染展示。
-
另外可以对分量设置个性化属性,如颜色、标签等。
通过极少量API调用,就可以绘制出丰富的线性图、柱状图、饼图等不同图表类型。这说明QT Chart的设计理念非常清晰、使用也很简单易上手。开发人员可以根据实际需求,通过组合这些基础类快速实现各种数据可视化工作。这无疑大大提升了开发效率。
最后附上源代码链接
对您有帮助的话,帮忙点个star