《Qt开发》基于QtCharts的柱形图绘制2

本程序包含三种柱形图的绘制

效果图如下:

1.在头文件中添加引用

#include <QtCharts>

添加如下变量和函数

//绘制一般柱形图

QChartView *view1;                    //绘图区域的容器

QChart *chart1;                       //绘图区域

QValueAxis *yAxis1;                   //纵轴

QBarCategoryAxis *xAxis1;             //横轴

QStringList categories1;              //横轴序列,多个柱状图为一组

QBarSet *cnr1_1 , *cnr1_2, *cnr1_3;   //载造比

QBarSeries *barSeries1;               //序列

void InitBarSeries1(QBarSeries *barSeries);

void InitAxis1();

void Init1();

void ClearData1();

//绘制堆叠柱形图

QChartView *view2;                   //绘图区域的容器

QChart *chart2;                      //绘图区域

QValueAxis *yAxis2;                  //纵轴

QBarCategoryAxis *xAxis2;            //横轴

QStringList categories2;             //横轴序列,多个柱状图为一组

QBarSet *cnr2_1, *cnr2_2, *cnr2_3;   //载造比

QStackedBarSeries *stackedSeries2;   //堆叠序列

void InitBarSet2(QBarSet *set1, QBarSet *set2, QBarSet *set3);

void InitBarSeries2(QStackedBarSeries *barSeries);

void InitAxis2();

void Init2();

void ClearData2();

//百分比柱形图

QChartView *view3;                   //绘图区域的容器

QChart *chart3;                      //绘图区域

QValueAxis *yAxis3;                  //纵轴

QBarCategoryAxis *xAxis3;            //横轴

QStringList categories3;             //横轴序列,多个柱状图为一组

QBarSet *cnr3_1, *cnr3_2, *cnr3_3;   //载造比

QPercentBarSeries *percentSeries3;   //百分比序列

void InitBarSet3(QBarSet *set1, QBarSet *set2, QBarSet *set3);

void InitBarSeries3(QPercentBarSeries *barSeries);

void InitAxis3();

void Init3();

void ClearData3();

//公用函数

void InitTableWidget();

void InitChartView(QChartView *chartView, QWidget *widget);

void InitChart(QChart *chart);

void InitBarSet(QBarSet *set1, QBarSet *set2, QBarSet *set3);

public slots:

void on_pBtnRandom_clicked();

2.在源文件中添加如下内容

#include <qtime>

const int rows = 4;

const int cols = 3;

#if defined(_MSC_VER) && (_MSC_VER >= 1600) 

# pragma execution_character_set("utf-8"

#endif

在构造函数中调用如下函数

InitTableWidget();

Init1();

Init2();

Init3();

//初始化表格

void BarChartEg::InitTableWidget()

{

    ui.tableWidget->setRowCount(rows);

    ui.tableWidget->setColumnCount(cols);

    QStringList headerList;

    headerList << "CNR1" << "CNR2" << "CNR3";

    ui.tableWidget->setHorizontalHeaderLabels(headerList);

}

//初始化一般柱状图

void BarChartEg::Init1()

{

    //1.准备QChartView对象,用来显示chart

    view1 = new QChartView(ui.widget);  

    InitChartView(view1, ui.widget);

    //2.准备QChart对象,用来绘图

    chart1 = new QChart();

    InitChart(chart1);

    //3.将chart添加到chartView上

    view1->setChart(chart1);

    //4.设置坐标轴

    InitAxis1();

   

    //5.准备barSeries对象,用于存储数据

    barSeries1 = new QBarSeries(this);

    InitBarSeries1(barSeries1);

    //6.准备barSet数据集,每组有几个柱形图就需要几个barset

    cnr1_1 = new QBarSet("CNR1");

    cnr1_2 = new QBarSet("CNR2");

    cnr1_3 = new QBarSet("CNR3");

    InitBarSet(cnr1_1, cnr1_2, cnr1_3);

    //7.为序列barSeries添加数据集barSet

    QList<QBarSet *> barSetList;

    barSetList << cnr1_1 << cnr1_2 << cnr1_3;

    barSeries1->append(barSetList);

    //8.将序列barSeries添加到chart上

    chart1->addSeries(barSeries1);

    //9.将坐标轴添加到chart上,并指定序列

    chart1->setAxisX(xAxis1, barSeries1);

    chart1->setAxisY(yAxis1, barSeries1);

}

//初始化堆叠柱状图

void BarChartEg::Init2()

{

    //1.准备QChartView对象,用来显示chart

    view2 = new QChartView(ui.widget_2);

    InitChartView(view2, ui.widget_2);

    //2.准备QChart对象,用来绘图

    chart2 = new QChart();

    InitChart(chart2);

    //3.将chart添加到chartView上

    view2->setChart(chart2);

    //4.设置坐标轴

    InitAxis2();

    //5.准备barSeries对象,用于存储数据

    stackedSeries2 = new QStackedBarSeries(this);

    InitBarSeries2(stackedSeries2);

    //6.准备barSet数据集,每组有几个柱形图就需要几个barset

    cnr2_1 = new QBarSet("CNR1");

    cnr2_2 = new QBarSet("CNR2");

    cnr2_3 = new QBarSet("CNR3");

    InitBarSet(cnr2_1, cnr2_2, cnr2_3);

    //7.为序列barSeries添加数据集barSet

    QList<QBarSet *> barSetList;

    barSetList << cnr2_1 << cnr2_2 << cnr2_3;

    stackedSeries2->append(barSetList);

    //8.将序列barSeries添加到chart上

    chart2->addSeries(stackedSeries2);

    //9.将坐标轴添加到chart上,并指定序列

    chart2->setAxisX(xAxis2, stackedSeries2);

    chart2->setAxisY(yAxis2, stackedSeries2);

}

//初始化百分比柱状图

void BarChartEg::Init3()

{

    //1.准备QChartView对象,用来显示chart

    view3 = new QChartView(ui.widget_3);

    InitChartView(view3, ui.widget_3);

    //2.准备QChart对象,用来绘图

    chart3 = new QChart();

    InitChart(chart3);

    //3.将chart添加到chartView上

    view3->setChart(chart3);

    //4.设置坐标轴

    InitAxis3();

    //5.准备barSeries对象,用于存储数据

    percentSeries3 = new QPercentBarSeries(this);

    InitBarSeries3(percentSeries3);

    //6.准备barSet数据集,每组有几个柱形图就需要几个barset

    cnr3_1 = new QBarSet("CNR1");

    cnr3_2 = new QBarSet("CNR2");

    cnr3_3 = new QBarSet("CNR3");

    InitBarSet(cnr3_1, cnr3_2, cnr3_3);

    //7.为序列barSeries添加数据集barSet

    QList<QBarSet *> barSetList;

    barSetList << cnr3_1 << cnr3_2 << cnr3_3;

    percentSeries3->append(barSetList);

    //8.将序列barSeries添加到chart上

    chart3->addSeries(percentSeries3);

    //9.将坐标轴添加到chart上,并指定序列

    chart3->setAxisX(xAxis3, percentSeries3);

    chart3->setAxisY(yAxis3, percentSeries3);

}

//设置QChartView布局

void BarChartEg::InitChartView(QChartView *chartView, QWidget *widget)

{

    chartView->setBackgroundBrush(QBrush(Qt::white));

    QHBoxLayout *hLayout = new QHBoxLayout;

    hLayout->setContentsMargins(0, 0, 0, 0);

    hLayout->addWidget(chartView);

    widget->setLayout(hLayout);

}

//设置chart

void BarChartEg::InitChart(QChart *chart)

{

    chart->layout()->setContentsMargins(5, 0, 5, 5);

    chart->setMargins(QMargins(1, 0, 1, 1));

    chart->setBackgroundRoundness(0);

    chart->setTheme(QChart::ChartThemeBlueCerulean);

}

//设置数据集外观

void BarChartEg::InitBarSet(QBarSet *set1, QBarSet *set2, QBarSet *set3)

{

    //设置数据集标签字体

    QFont font("宋体", 8, 0); 

    font.setBold(true);

    set1->setLabelFont(font);

    set2->setLabelFont(font);

    set3->setLabelFont(font);

    //设置数据集标签颜色

    set1->setLabelColor(QColor(255, 0, 0));

    set2->setLabelColor(QColor(255, 0, 0));

    set3->setLabelColor(QColor(255, 0, 0));

}

//设置序列标签和宽度

void BarChartEg::InitBarSeries1(QBarSeries *barSeries)

{

    //barSeries->setLabelsPosition(QAbstractBarSeries::LabelsCenter);//在柱形图内部中间

    //barSeries->setLabelsPosition(QAbstractBarSeries::LabelsInsideEnd);//在柱形图内部顶端

    //barSeries->setLabelsPosition(QAbstractBarSeries::LabelsInsideBase);//在柱形图内部下端

    barSeries->setLabelsPosition(QAbstractBarSeries::LabelsOutsideEnd);//在柱形图外部上端

    barSeries->setLabelsVisible(true);

    barSeries->setBarWidth(0.5);

}

void BarChartEg::InitBarSeries2(QStackedBarSeries *barSeries)

{

    barSeries->setLabelsPosition(QAbstractBarSeries::LabelsCenter);//在柱形图外部上端

    barSeries->setLabelsVisible(true);

    barSeries->setBarWidth(0.5);

}

void BarChartEg::InitBarSeries3(QPercentBarSeries *barSeries)

{

    barSeries->setLabelsPosition(QAbstractBarSeries::LabelsCenter);//在柱形图外部上端

    barSeries->setLabelsVisible(true);

    barSeries->setBarWidth(0.5);

}

//准备坐标轴对象

void BarChartEg::InitAxis1()

{

    xAxis1 = new QBarCategoryAxis(this);

    xAxis1->setGridLineVisible(false);

    yAxis1 = new QValueAxis(this);

    yAxis1->setRange(0, 60);

}

//准备坐标轴对象

void BarChartEg::InitAxis2()

{

    xAxis2 = new QBarCategoryAxis(this);

    xAxis2->setGridLineVisible(false);

    yAxis2 = new QValueAxis(this);

    yAxis2->setRange(0, 200);

}

//准备坐标轴对象

void BarChartEg::InitAxis3()

{

    xAxis3 = new QBarCategoryAxis(this);

    xAxis3->setGridLineVisible(false);

    yAxis3 = new QValueAxis(this);

    yAxis3->setRange(0, 100);

}

//产生随机数,并将数据添加到数据集

void BarChartEg::on_pBtnRandom_clicked()

{

    ClearData1();

    ClearData2();

    ClearData3();

    qsrand(QTime::currentTime().second()); //随机数种子

    for (int i = 0; i < rows; i++)

    {

        for (int j = 0; j < cols; j++)

        {

            double randomData = 30 + (qrand() % 30);  //随机数

            ui.tableWidget->setItem(i,j,new QTableWidgetItem(QString::asprintf("%.0f",randomData)));

           

            if (j == 0)

            {

                cnr1_1->append(randomData);

                cnr2_1->append(randomData);

                cnr3_1->append(randomData);

            }      

            if (j == 1)

            {

                cnr1_2->append(randomData);

                cnr2_2->append(randomData);

                cnr3_2->append(randomData);

            }

            if (j == 2)

            {

                cnr1_3->append(randomData);

                cnr2_3->append(randomData);

                cnr3_3->append(randomData);

            }

        }

        categories1.append("序列"+QString::number(i + 1));

        categories2.append("序列" + QString::number(i + 1));

        categories3.append("序列" + QString::number(i + 1));

    }

    //将横坐标的标签添加到横坐标轴

    xAxis1->setCategories(categories1); 

    xAxis2->setCategories(categories2);

    xAxis3->setCategories(categories3);

}

//清除数据

void BarChartEg::ClearData1()

{

    categories1.clear();

    cnr1_1->remove(0, 4);

    cnr1_2->remove(0, 4);

    cnr1_3->remove(0, 4);

}

void BarChartEg::ClearData2()

{

    categories2.clear();

    cnr2_1->remove(0, 4);

    cnr2_2->remove(0, 4);

    cnr2_3->remove(0, 4);

}

void BarChartEg::ClearData3()

{

    categories3.clear();

    cnr3_1->remove(0, 4);

    cnr3_2->remove(0, 4);

    cnr3_3->remove(0, 4);

}

 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不相信眼泪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值