本程序包含三种柱形图的绘制
效果图如下:
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);
}