简述
本文主要介绍Qt柱状图的简单用法。以及改造为多组柱状图、多彩柱状图。
示例1:柱状图
在pro文件中加入 QT += charts,主要用到的头文件有:
#include <QtCharts>
#include <QBarSeries>
#include <QBarCategoryAxis>
#include <QVBoxLayout>
以下是创建柱状图的代码:
void MainWindow::initBarChart()
{
QChart* chart = new QChart;
chart->legend()->setVisible(false);
chart->setTitle("柱状图");
QChartView* chartView = new QChartView(this);
chartView->setRenderHint(QPainter::Antialiasing);
chartView->setChart(chart);
//加入到主界面中
QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget(chartView);
ui->centralwidget->setLayout(layout);
//设置X轴
QBarCategoryAxis* category_axis_x = new QBarCategoryAxis(chart);
chart->addAxis(category_axis_x, Qt::AlignBottom);
//设置X轴标签
QStringList categories = { "A", "B", "C", "D", "E"};
category_axis_x->setCategories(categories);
//设置Y轴
QValueAxis* axis_y = new QValueAxis(chart);
chart->addAxis(axis_y, Qt::AlignLeft);
//创建柱状图
QBarSeries* bar_series = new QBarSeries(chart);
chart->addSeries(bar_series);
//加入坐标轴
bar_series->attachAxis(category_axis_x);
bar_series->attachAxis(axis_y);
//创建1组柱状图
QBarSet* set = new QBarSet("", chart);
bar_series->append(set);
//设置数据
QList<qreal> list_data = {9,8,7,6,5};
set->append(list_data);
//设置显示范围
axis_y->setRange(0, 10);
//设置Y轴刻度数
axis_y->setTickCount(3);
}
示例2:多组柱状图
以下是创建多组柱状图的代码:
void MainWindow::initBarChart2()
{
QChart* chart = new QChart;
chart->legend()->setVisible(false);
QChartView* chartView = new QChartView(this);
chartView->setRenderHint(QPainter::Antialiasing);
chartView->setChart(chart);
//加入到主界面中
QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget(chartView);
ui->centralwidget->setLayout(layout);
//设置X轴
QBarCategoryAxis* category_axis_x = new QBarCategoryAxis(chart);
chart->addAxis(category_axis_x, Qt::AlignBottom);
//设置X轴标签
QStringList categories = { "A", "B", "C", "D", "E"};
category_axis_x->setCategories(categories);
//设置Y轴
QValueAxis* axis_y = new QValueAxis(chart);
chart->addAxis(axis_y, Qt::AlignLeft);
//创建柱状图
QBarSeries* bar_series = new QBarSeries(chart);
chart->addSeries(bar_series);
bar_series->attachAxis(category_axis_x);
bar_series->attachAxis(axis_y);
//设置3列数据
QBarSet* set1 = new QBarSet("", chart);
QBarSet* set2 = new QBarSet("", chart);
QBarSet* set3 = new QBarSet("", chart);
bar_series->append(set1);
bar_series->append(set2);
bar_series->append(set3);
QList<qreal> list_data1 = {9,8,7,6,5};
QList<qreal> list_data2 = {5,6,9,3,5};
QList<qreal> list_data3 = {4,2,6,9,3};
set1->append(list_data1);
set2->append(list_data2);
set3->append(list_data3);
//设置显示范围
axis_y->setRange(0, 10);
//设置Y轴刻度数
axis_y->setTickCount(3);
}
示例3:多彩柱状图
以下是创建多彩柱状图的代码:
void MainWindow::initColorfulBarChart()
{
QChart* chart = new QChart;
chart->legend()->setVisible(false);
QChartView* chartView = new QChartView(this);
chartView->setRenderHint(QPainter::Antialiasing);
chartView->setChart(chart);
//加入到主界面中
QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget(chartView);
ui->centralwidget->setLayout(layout);
//设置X轴
QBarCategoryAxis* category_axis_x = new QBarCategoryAxis(chart);
chart->addAxis(category_axis_x, Qt::AlignBottom);
//设置X轴标签
QStringList categories = { "A", "B", "C", "D", "E"};
category_axis_x->setCategories(categories);
//设置Y轴
QValueAxis* axis_y = new QValueAxis(chart);
chart->addAxis(axis_y, Qt::AlignLeft);
//创建柱状图, 这里将QBarSeries改为QStackedBarSeries, 为了使柱子的位置在中间
QStackedBarSeries* bar_series = new QStackedBarSeries(chart);
chart->addSeries(bar_series);
bar_series->attachAxis(category_axis_x);
bar_series->attachAxis(axis_y);
//设置数据
QList<int> list_data = {9,8,7,6,5};
//设置颜色
QStringList list_color = {"#63b2ee","#76da91","#f8cb7f","#f89588","#7cd6cf"};
int top_count = categories.size();
//加入多组QBarSet,为了设置不同的颜色
QList<QBarSet*> list_bars;
for (int i = 0; i < top_count; i++) {
QBarSet* set = new QBarSet("", chart);
list_bars << set;
for (int j = 0; j < top_count; j++) {
*set << 0;
}
//设置条形图颜色
set->setColor(list_color[i]);
set->setBorderColor(QColor(list_color[i]));
bar_series->append(set);
}
//更新数据
for (int i = 0; i < top_count; i++) {
list_bars[i]->replace(i, list_data[i]);
}
//设置显示范围
axis_y->setRange(0, 10);
//设置Y轴刻度数
axis_y->setTickCount(3);
}
一组柱状图只能设置一种颜色,这里本质上就是多组柱状图, 不需要显示的列设置为0了而已。将多组柱状图中用到的QBarSeries改为了QStackedBarSeries,是为了让柱子的位子在中间,而不是靠左。