本程序包含的内容如下:
- 通过伪随机函数产生随机数,填充表格
- 同时用产生的随机数绘制柱状图
- 每组包含多个柱状图
效果图如下:
常用类汇总
QBarSet:用于创建柱状图的数据集
QBarSeries:柱状图序列,一个柱状图序列一般包含多个QBarSet数据集
QBarCategoryAxis:柱状图分类坐标,以文字标签形式表示的坐标
QBarSet类的主要函数
分组 | 函数 | 功能描述 |
标签 | void setLabel() | 设置数据集的标签,用于图例显示的文字 |
void setLabelBrush() | 设置标签的画刷 | |
void setLabelColor() | 设置标签的文字颜色 | |
void setLabelFont() | 设置标签的字体 | |
数据棒/柱子 | void setBorderColor() | 设置数据集棒图的边框颜色 |
void setBrush() | 设置数据集棒图的画刷 | |
void setColor() | 设置数据集的棒图填充颜色 | |
void senPen() | 设置数据集棒图的边框画笔 | |
数据点 | void append() | 添加一个数据到数据集 |
void insert() | 在某个位置插入一个数据到数据集 | |
void remove() | 从某个位置开始删除一定数量的数据 | |
void replace() | 替换某个位置的数据 | |
qreal at() | 返回某个位置的数据 | |
int count() | 返回数据的个数 | |
qreal sum() | 返回数据集内所有数据的和 |
QBarSeries类的主要函数
分组 | 函数 | 功能描述 |
外观 | void setBarWidth() | 设置数据棒的宽度 |
void setLabelsVisible() | 设置数据棒的标签可见性 | |
void setLabelFormat() | 设置数据棒标签的格式,只支持一种:@value | |
void setLabelAngle() | 设置标签角度 | |
数据集 | bool append() | 添加一个QBarSet数据集到序列 |
bool insert() | 在某个位置插入一个数据集到序列 | |
bool remove() | 移除一个数据集,解除所属关系,并删除数据集对象 | |
bool take() | 移除一个数据集,但不删除数据集对象 | |
void clear() | 清除全部数据集,并删除数据集对象 | |
QList<QBarSet *> barSets() | 返回数据集对象的列表 | |
int count() | 返回数据集的个数 |
QBarCategoryAxis类的主要函数
分组 | 函数 | 功能描述 |
坐标 内容 | void append() | 添加一个类别到坐标轴 |
void insert() | 在某个位置插入一个类别到坐标轴 | |
void replace() | 替换某个类别 | |
void remove() | 移除某个类别 | |
void clear() | 删除所有类别 | |
QString at() | 返回某个索引位置的类别文字 | |
int count() | 返回类别个数 | |
void setCategories() | 设置一个QStringList字符串列表作为坐标轴的类别文字,删除所有类别文字 | |
坐标 范围 | void setMin() | 设置坐标轴最小值 |
void setMax() | 设置坐标轴最大值 | |
void setRange() | 设置坐标轴范围 |
程序开发记录
1.工程创建完毕后,添加QtChart模块。Release模式下,项目——属性,添加如下
Debug模式下,也需要添加如上两个内容,第二个图中的库修改为Qt5Chartsd.lib
2.布局如下
3.在头文件中添加引用
#include <QtCharts>
添加如下变量和函数
QChartView *GPSview; //绘图区域的容器
QChart *chartGPS; //绘图区域
QValueAxis *yAxisGPS; //纵轴
QBarCategoryAxis *xAxisGPS; //横轴
QStringList categoriesGPS; //柱状图分类坐标,以文字标签形式表示的坐标
QBarSet *GPS_L1, *GPS_L2, *GPS_L5; //GPS系统对应的载造比
QBarSeries *seriesGPS; //序列
void InitTableWidget();
void InitBarSet(QBarSet *set1, QBarSet *set2, QBarSet *set3);
void InitBarSeries(QBarSeries *barSeries);
void InitAxis();
void InitChart(QChart *chart);
void InitChartView(QChartView *chartView, QWidget *widget);
void Init();
void ClearData();
public slots:
void on_pBtnRandom_clicked();
在源文件中添加如下函数
void BarChartEg::Init()
{
InitTableWidget();
//1.准备QChartView对象,用来显示chart
GPSview = new QChartView(ui.widget);
InitChartView(GPSview, ui.widget);
//2.准备QChart对象,用来绘图
chartGPS = new QChart();
InitChart(chartGPS);
//3.将chart添加到chartView上
GPSview->setChart(chartGPS);
//4.设置坐标轴
InitAxis();
//5.准备barSeries柱状图序列,包含数据集
seriesGPS = new QBarSeries(this);
InitBarSeries(seriesGPS);
//6.准备barSet数据集,创建柱形图
GPS_L1 = new QBarSet("CNR1");
GPS_L2 = new QBarSet("CNR2");
GPS_L5 = new QBarSet("CNR3");
InitBarSet(GPS_L1, GPS_L2, GPS_L5);
//7.为序列barSeries添加数据集barSet
QList<QBarSet *> barSetList_GPS;
barSetList_GPS << GPS_L1 << GPS_L2 << GPS_L5;
seriesGPS->append(barSetList_GPS);
//8.将序列barSeries添加到chart上
chartGPS->addSeries(seriesGPS);
//9.将坐标轴添加到chart上,并指定序列
chartGPS->setAxisX(xAxisGPS, seriesGPS);
chartGPS->setAxisY(yAxisGPS, seriesGPS);
}
void BarChartEg::InitTableWidget()
{
ui.tableWidget->setRowCount(rows);
ui.tableWidget->setColumnCount(cols);
QStringList headerList;
headerList << "CNR1" << "CNR2" << "CNR3";
ui.tableWidget->setHorizontalHeaderLabels(headerList);
}
//设置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);
}
void BarChartEg::InitChart(QChart *chart)
{
chart->layout()->setContentsMargins(5, 0, 5, 5);
chart->setMargins(QMargins(1, 0, 1, 1));
chart->setBackgroundRoundness(0);
}
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(0,0,0));
set2->setLabelColor(QColor(0, 0, 0));
set3->setLabelColor(QColor(0, 0, 0));
}
void BarChartEg::InitBarSeries(QBarSeries *barSeries)
{
barSeries->setLabelsFormat("@value");
//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::InitAxis()
{
xAxisGPS = new QBarCategoryAxis(this);
xAxisGPS->setGridLineVisible(false);
yAxisGPS = new QValueAxis(this);
yAxisGPS->setRange(0, 60);
}
void BarChartEg::on_pBtnRandom_clicked()
{
ClearData();
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)
GPS_L1->append(randomData);
if (j == 1)
GPS_L2->append(randomData);
if (j == 2)
GPS_L5->append(randomData);
}
categoriesGPS.append("序列"+QString::number(i+1));
}
xAxisGPS->setCategories(categoriesGPS);
}
void BarChartEg::ClearData()
{
xAxisGPS->clear();
categoriesGPS.clear();
GPS_L1->remove(0, 4);
GPS_L2->remove(0, 4);
GPS_L5->remove(0, 4);
}