QT Charts绘图-柱状图、折线图的绘画
图表的类型由数据序列决定,除了折线图,QT charts还提供了柱状图、饼图、百分比图等常见图表。本程序主要目的时演示柱状图的绘制方法,以此深入了解QT Charts的基本用法。
程序实现的功能
在运行界面的左上方 “初始化数据“ 按钮实现了随机生成若干个学生的数学、语文、英语分数。平均分是自动计算的,左下方是根据分数统计的结果,右方是图表的页面。当我们修改学生数据时,themodel会发出itemChanged()信号,相应的on_itemChanged()槽函数自动跟新图表,和统计结果。运行界面如下:
界面分析
窗口左上方是一个QTableView组件,使用Model/View结构提供数据编辑功能。左下角是一个QTreeWidget组件,用于显示统计数据结果。窗口右方是一个QTabWidget组件,用于显示柱状图。图表的显示用一个QgraphicsView组件升级为QChartsView。
mainwindow.h的实现
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include <QtCharts>
#define fixedColumnCount 5 //数据模型的列数
#define iniDataRowCount 10 //学生个数
#define colNoName 0 //姓名的列编号
#define colNoMath 1 //数学的列编号
#define colNoChinese 2 //语文的列编号
#define colNoEnglish 3 //英语的列编号
#define colNoAverage 4 //平均分的列编号
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QStandardItemModel *theModel;//数据模型
void iniData();//初始化数据
void surveyData();//统计数据
void iniBarChart(); //柱状图初始化
void buildBarChart();//构建柱状图
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_actGenData_triggered(); //初始化数据
void on_actTongJi_triggered(); //统计结果
//当数据发生变化时 更新图表
void on_itemChanged(QStandardItem *item);
void on_btnBuildBarChart_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp的实现
#include "mainwindow.h"
#include "ui_mainwindow.h"
void MainWindow::iniData()
{
//数据初始化
QStringList headerList;
headerList<<"姓名"<<"数学"<<"语文"<<"英语"<<"平均分";
theModel->setHorizontalHeaderLabels(headerList); //设置表头文字
qsrand(QTime::currentTime().second());//随机数种子
for (int i=0;i<theModel->rowCount();i++)
{
QString studName=QString::asprintf("学生%2d",i+1);
QStandardItem* aIt