300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Qt绘制柱状图BarChart 饼状图PieChart 堆叠柱状图StackedChart 散点图ScatterChart

Qt绘制柱状图BarChart 饼状图PieChart 堆叠柱状图StackedChart 散点图ScatterChart

时间:2021-03-23 08:17:30

相关推荐

Qt绘制柱状图BarChart 饼状图PieChart 堆叠柱状图StackedChart 散点图ScatterChart

一、效果展示

二、工程中添加charts模块

三、在工程布局文件中放一块Graphics View,然后右键提升为QChartView,每个Tab都一样、如下图

四、更改控件名,如下图所示

五、MainWindow.h文件

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QStandardItemModel>#include <QItemSelectionModel>#include <QChartView>#include <QLineSeries>#include <QtMath>#include <QValueAxis>#include <QtCharts>#include <QPainter>#include <QRandomGenerator>#include <QtMath>#include <QMargins>QT_BEGIN_NAMESPACEnamespace Ui {class MainWindow; }QT_END_NAMESPACE#define fixedColumnCount 5#define iniDataRowCount 6#define ColNoName 0#define colNoMath 1#define colNoChinese 2#define colNoEnglish 3#define colNoAverage 4class MainWindow : public QMainWindow{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_actionGenData_triggered();void on_actionStatistics_triggered();void on_btnBuildBarChart_clicked();void on_btnDrawPieChart_clicked();void on_slice_highlight(bool);void on_spinBoxSetHoleSize_valueChanged(double arg1);void on_spinBoxSetPieSize_valueChanged(double arg1);void on_comboBoxTheme_currentIndexChanged(int index);void on_btnDrawStackedBar_clicked();void on_btnDrawPercentBar_clicked();void on_btnDrawScatterChart_clicked();private:Ui::MainWindow *ui;QStandardItemModel *theModel;QItemSelectionModel *theSelection;void init_date();void surey_data();void init_bar_chart();void build_bar_chart();void init_pie_chart();void build_pie_chart();void init_stacked_chart();void build_stacked_chart();void init_percent_chart();void build_percent_chart();void init_scatter_chart();void build_scatter_chart();};#endif // MAINWINDOW_H

六、MainWindow.cpp文件

#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ui->setupUi(this);theModel = new QStandardItemModel(iniDataRowCount,fixedColumnCount,this);theSelection = new QItemSelectionModel(theModel);ui->tableView->setModel(theModel);init_date();init_bar_chart();build_bar_chart();init_pie_chart();init_stacked_chart();init_percent_chart();init_scatter_chart();}MainWindow::~MainWindow(){delete ui;}void MainWindow::init_date(){QStringList headerList;headerList<<"姓名"<<"数学"<<"语文"<<"英语"<<"平均分";theModel->setHorizontalHeaderLabels(headerList);for(int i=0;i<theModel->rowCount();i++){QString stuName = QString::asprintf("学生%2d",i+1);QStandardItem *aItem = new QStandardItem(stuName);aItem->setTextAlignment(Qt::AlignHCenter);theModel->setItem(i,ColNoName,aItem);qreal average = 0;for(int j=colNoMath;j<=colNoEnglish;j++){qreal score = 50.0+QRandomGenerator::global()->bounded(0,50);aItem = new QStandardItem(QString::asprintf("%.0f",score));aItem->setTextAlignment(Qt::AlignHCenter);theModel->setItem(i,j,aItem);average+=score;}aItem = new QStandardItem(QString::asprintf("%.1f",average/3));aItem->setTextAlignment(Qt::AlignHCenter);aItem->setFlags(aItem->flags()&!Qt::ItemIsEditable);theModel->setItem(i,colNoAverage,aItem);}}void MainWindow::surey_data(){for(int i=colNoMath;i<=colNoAverage;i++){qreal minVal = 100,maxVal = 0,val,sum =0;int cnt50=0,cnt60=0,cnt70=0,cnt80=0,cnt90=0;for(int j=0;j<theModel->rowCount();j++){val = theModel->item(j,i)->text().toDouble();if(val>maxVal)maxVal = val;if(val<minVal)minVal = val;if(val<60)cnt50++;else if(val<70)cnt60++;else if(val<80)cnt70++;else if(val<90)cnt80++;elsecnt90++;sum+=val;}QTreeWidgetItem *aItem = ui->treeWidget->topLevelItem(0);aItem->setTextAlignment(i,Qt::AlignHCenter);aItem->setText(i,QString::number(cnt50));aItem = ui->treeWidget->topLevelItem(1);aItem->setTextAlignment(i,Qt::AlignHCenter);aItem->setText(i,QString::number(cnt60));aItem = ui->treeWidget->topLevelItem(2);aItem->setTextAlignment(i,Qt::AlignHCenter);aItem->setText(i,QString::number(cnt70));aItem = ui->treeWidget->topLevelItem(3);aItem->setTextAlignment(i,Qt::AlignHCenter);aItem->setText(i,QString::number(cnt80));aItem = ui->treeWidget->topLevelItem(4);aItem->setTextAlignment(i,Qt::AlignHCenter);aItem->setText(i,QString::number(cnt90));aItem = ui->treeWidget->topLevelItem(5);aItem->setTextAlignment(i,Qt::AlignHCenter);aItem->setText(i,QString::number(sum/theModel->rowCount()));aItem = ui->treeWidget->topLevelItem(6);aItem->setTextAlignment(i,Qt::AlignHCenter);aItem->setText(i,QString::number(maxVal));aItem = ui->treeWidget->topLevelItem(7);aItem->setTextAlignment(i,Qt::AlignHCenter);aItem->setText(i,QString::number(minVal));}}void MainWindow::on_actionGenData_triggered(){init_date();}void MainWindow::on_actionStatistics_triggered(){surey_data();}void MainWindow::on_btnBuildBarChart_clicked(){build_bar_chart();}void MainWindow::on_btnDrawPieChart_clicked(){build_pie_chart();}void MainWindow::init_bar_chart(){QChart *chart = new QChart();chart->setTitle("BarChart演示");chart->setAnimationOptions(QChart::SeriesAnimations);ui->chartViewBar->setChart(chart);ui->chartViewBar->setRenderHint(QPainter::Antialiasing);}void MainWindow::build_bar_chart(){QChart *chart = ui->chartViewBar->chart();chart->removeAllSeries();if(chart->axisX() != NULL)chart->removeAxis(chart->axisX());if(chart->axisY() != NULL)chart->removeAxis(chart->axisY());//数据集QBarSet *setMath = new QBarSet(theModel->horizontalHeaderItem(colNoMath)->text());QBarSet *setChinese = new QBarSet(theModel->horizontalHeaderItem(colNoChinese)->text());QBarSet *setEnglish = new QBarSet(theModel->horizontalHeaderItem(colNoEnglish)->text());QLineSeries *line = new QLineSeries;QPen pen;pen.setColor(Qt::red);pen.setWidth(2);line->setPen(pen);line->setName(theModel->horizontalHeaderItem(colNoAverage)->text());for(int i=0;i<theModel->rowCount();i++){setMath->append(theModel->item(i,colNoMath)->text().toInt());setChinese->append(theModel->item(i,colNoChinese)->text().toInt());setEnglish->append(theModel->item(i,colNoEnglish)->text().toInt());line->append(QPointF(i,theModel->item(i,colNoAverage)->text().toDouble()));}//序列QBarSeries *series = new QBarSeries;series->append(setMath);series->append(setChinese);series->append(setEnglish);chart->addSeries(series);chart->addSeries(line);//坐标轴QStringList categories;for(int i=0;i<theModel->rowCount();i++){categories<<theModel->item(i,ColNoName)->text();}QBarCategoryAxis *axisX = new QBarCategoryAxis;axisX->setCategories(categories);chart->setAxisX(axisX,series);chart->setAxisX(axisX,line);QValueAxis *axisY = new QValueAxis;axisY->setRange(0,100);axisY->setTitleText("分数");chart->setAxisY(axisY,series);chart->setAxisY(axisY,line);chart->legend()->setAlignment(Qt::AlignBottom);}void MainWindow::init_pie_chart(){QChart *chart = new QChart();chart->setTitle("PieChart演示");chart->setAnimationOptions(QChart::SeriesAnimations);ui->chartViewPie->setChart(chart);ui->chartViewPie->setRenderHint(QPainter::Antialiasing);}void MainWindow::build_pie_chart(){QChart *chart = ui->chartViewPie->chart();chart->removeAllSeries();if(chart->axisX() != NULL)chart->removeAxis(chart->axisX());if(chart->axisY() != NULL)chart->removeAxis(chart->axisY());QPieSeries *series = new QPieSeries;series->setHoleSize(ui->spinBoxSetHoleSize->value());series->setPieSize(ui->spinBoxSetPieSize->value());int colNo = ui->comboBoxCourse->currentIndex()+1;for(int i=0;i<5;i++){QTreeWidgetItem *item = ui->treeWidget->topLevelItem(i);series->append(item->text(0),item->text(colNo).toDouble());}//坐标轴QPieSlice *slice;for(int i=0;i<5;i++){slice = series->slices().at(i);slice->setLabel(slice->label()+QString::asprintf("%.0f人,%.1f",slice->value(),slice->percentage()));connect(slice,&QPieSlice::hovered,this,&MainWindow::on_slice_highlight);}series->setLabelsVisible(true);chart->setTitle("PieChart:"+ui->comboBoxCourse->currentText());chart->addSeries(series);chart->legend()->setAlignment(Qt::AlignRight);}void MainWindow::on_slice_highlight(bool show){QPieSlice *slice = (QPieSlice *)sender();slice->setExploded(show);}void MainWindow::on_spinBoxSetHoleSize_valueChanged(double arg1){QPieSeries *series;series = (QPieSeries *)ui->chartViewPie->chart()->series().at(0);series->setHoleSize(arg1);}void MainWindow::on_spinBoxSetPieSize_valueChanged(double arg1){QPieSeries *series;series = (QPieSeries *)ui->chartViewPie->chart()->series().at(0);series->setPieSize(arg1);}void MainWindow::on_comboBoxTheme_currentIndexChanged(int index){ui->chartViewPie->chart()->setTheme(QChart::ChartTheme(index));}void MainWindow::on_btnDrawStackedBar_clicked(){build_stacked_chart();}void MainWindow::init_stacked_chart(){QChart *chart = new QChart();chart->setTitle("StackedChart演示");chart->setAnimationOptions(QChart::SeriesAnimations);ui->chartViewStackedBar->setChart(chart);ui->chartViewStackedBar->setRenderHint(QPainter::Antialiasing);}void MainWindow::build_stacked_chart(){QChart *chart = ui->chartViewStackedBar->chart();chart->removeAllSeries();if(chart->axisX() != NULL)chart->removeAxis(chart->axisX());if(chart->axisY() != NULL)chart->removeAxis(chart->axisY());//数据集QBarSet *setMath = new QBarSet(theModel->horizontalHeaderItem(colNoMath)->text());QBarSet *setChinese = new QBarSet(theModel->horizontalHeaderItem(colNoChinese)->text());QBarSet *setEnglish = new QBarSet(theModel->horizontalHeaderItem(colNoEnglish)->text());QStringList categories;for(int i=0;i<theModel->rowCount();i++){categories<<theModel->item(i,ColNoName)->text();setMath->append(theModel->item(i,colNoMath)->text().toInt());setChinese->append(theModel->item(i,colNoChinese)->text().toInt());setEnglish->append(theModel->item(i,colNoEnglish)->text().toInt());}QStackedBarSeries *series = new QStackedBarSeries;series->append(setMath);series->append(setChinese);series->append(setEnglish);QBarCategoryAxis *axisX = new QBarCategoryAxis;axisX->setCategories(categories);chart->setAxisX(axisX,series);QValueAxis *axisY = new QValueAxis;axisY->setRange(0,300);axisY->setTitleText("总分");chart->setAxisY(axisY,series);chart->addSeries(series);}void MainWindow::on_btnDrawPercentBar_clicked(){build_percent_chart();}void MainWindow::init_percent_chart(){QChart *chart = new QChart();chart->setTitle("PercentChart演示");chart->setAnimationOptions(QChart::SeriesAnimations);ui->chartViewPercentBar->setChart(chart);ui->chartViewPercentBar->setRenderHint(QPainter::Antialiasing);}void MainWindow::build_percent_chart(){QChart *chart = ui->chartViewPercentBar->chart();chart->removeAllSeries();if(chart->axisX() != NULL)chart->removeAxis(chart->axisX());if(chart->axisY() != NULL)chart->removeAxis(chart->axisY());//数据集QBarSet *setMath = new QBarSet(theModel->horizontalHeaderItem(colNoMath)->text());QBarSet *setChinese = new QBarSet(theModel->horizontalHeaderItem(colNoChinese)->text());QBarSet *setEnglish = new QBarSet(theModel->horizontalHeaderItem(colNoEnglish)->text());QStringList categories;for(int i=0;i<5;i++){categories<<ui->treeWidget->topLevelItem(i)->text(ColNoName);setMath->append(ui->treeWidget->topLevelItem(i)->text(colNoMath).toDouble());setChinese->append(ui->treeWidget->topLevelItem(i)->text(colNoChinese).toDouble());setEnglish->append(ui->treeWidget->topLevelItem(i)->text(colNoEnglish).toDouble());}QPercentBarSeries *series = new QPercentBarSeries;series->append(setMath);series->append(setChinese);series->append(setEnglish);QBarCategoryAxis *axisX = new QBarCategoryAxis;axisX->setCategories(categories);chart->setAxisX(axisX,series);QValueAxis *axisY = new QValueAxis;// axisY->setRange(0,300);axisY->setTitleText("分数");chart->setAxisY(axisY,series);chart->addSeries(series);}void MainWindow::on_btnDrawScatterChart_clicked(){build_scatter_chart();}void MainWindow::init_scatter_chart(){QChart *chart = new QChart();chart->setTitle("ScatterChart演示");chart->setAnimationOptions(QChart::SeriesAnimations);ui->chartViewScatterChart->setChart(chart);ui->chartViewScatterChart->setRenderHint(QPainter::Antialiasing);}void MainWindow::build_scatter_chart(){QChart *chart = ui->chartViewScatterChart->chart();chart->removeAllSeries();if(chart->axisX() != NULL)chart->removeAxis(chart->axisX());if(chart->axisY() != NULL)chart->removeAxis(chart->axisY());QSplineSeries *seriesLine = new QSplineSeries;seriesLine->setName("Line");QPen pen;pen.setWidth(2);pen.setColor(Qt::red);seriesLine->setPen(pen);QScatterSeries *series0 = new QScatterSeries;series0->setName("散点");series0->setMarkerShape(QScatterSeries::MarkerShapeCircle);series0->setBorderColor(Qt::black);series0->setBrush(QBrush(Qt::blue));series0->setMarkerSize(12);for(int i=0;i<10;i++){int x = QRandomGenerator::global()->bounded(0,20);int y = QRandomGenerator::global()->bounded(0,20);series0->append(x,y);seriesLine->append(x,y);}chart->addSeries(series0);chart->addSeries(seriesLine);chart->createDefaultAxes();chart->axisX()->setTitleText("X轴");chart->axisX()->setRange(-2,22);chart->axisY()->setTitleText("Y轴");chart->axisY()->setRange(-2,22);}

七、工程文件

工程文件下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。