void MainWindow::buildBarChart()
{
QChart *chart = ui->chartViewBar->chart();
/*每次刷新都清空一下上次的数据*/
chart->removeAllSeries();
if(chart->axisX() != NULL)
{
chart->removeAxis(chart->axisX());
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());
/*平均分是一条滑线,需要line来表示*/
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().split(":").at(1).toInt());
setChinese->append(themodel->item(i, colNoChinese)->text().split(":").at(1).toInt());
setEnglish->append(themodel->item(i, colNoEnglish)->text().split(":").at(1).toInt());
/*滑线不太一样,x值--i, y值--平均分*/
/*一个点由x坐标和y坐标指定,可以使用x()和y()函数访问*/
line->append(QPointF(i, themodel->item(i, colNoAverage)->text().split(":").at(1).toDouble()));
}
/*序列*/
/*把三个科目放到一个集合中*/
QBarSeries * series = new QBarSeries;
series->append(setMath);
series->append(setChinese);
series->append(setEnglish);
/*把各科文本标头、滑线文本,2个系列添加到图表中*/
chart->addSeries(series);
chart->addSeries(line);
QStringList categories;
for(int i = 0; i < themodel->rowCount(); i++) {
categories << themodel->item(i, colNoName)->text().split(":").at(1);
qDebug() << themodel->item(i, colNoName)->text() << endl;;
}
// ---创建坐标轴 !!很关键,未设置,会导致图标显示有问题,包括滑线,显示会很怪异---//
QBarCategoryAxis *axisX = new QBarCategoryAxis;/*X轴*/
axisX->setCategories(categories);
QValueAxis * axisY = new QValueAxis;/*Y轴*/
axisY->setRange(0, 100);
axisY->setTitleText(QString::fromLocal8Bit("分数"));
/*设置X、Y轴数据集,为序列设置坐标轴*/
chart->setAxisX(axisX, series);
chart->setAxisX(axisX, line);
chart->setAxisY(axisY, series);
chart->setAxisY(axisY, line);
/*标头文本放置窗口的最下方*/
chart->legend()->setAlignment(Qt::AlignBottom);
}
图示:
注意
QValueAxis、QCategoryAxis的简单区别
简单的说QValueAxis是一个懒人版,轴的范围什么的不需要自己指定,轴上显示的label(也就是0,1,2,3这些内容)是默认的。qt会根据你轴上的点自动设置。
若你需要自定义一些内容,QCategoryAxis是比较好的,但是需要自己自定义好才可以调用。
————————————————
版权声明:本文为CSDN博主「HanLongXia」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/HanLongXia/article/details/122156920