基本思路
- 使用Qt的控件Table绘制表格
- 使用Qt提供的类QChart绘制曲线、饼状、条形图等
统计表格
- 示例程序
void Form_pointState::buildTable(QVector<Point*> vecPoint)
{
//设置表格单元格不可编辑
ui->tb_pointState->setEditTriggers(QAbstractItemView::NoEditTriggers);
//设置表格行数
ui->tb_pointState->setRowCount(vecPoint.size());
//设置表格列数
ui->tb_pointState->setColumnCount(2);
//设置表格列表头
ui->tb_pointState->setHorizontalHeaderLabels(QStringList()<<"表头1"<<"表头2");
//填入单元格内容
for (int i=0;i<ui->tb_pointState->rowCount();i++) {
//填入内容
ui->tb_pointState->setItem(i,0,new QTableWidgetItem(QString::number(vecPoint[i]->mem1)));
//设置单元格内容居中
ui->tb_pointState->item(i,0)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tb_pointState->setItem(i,1,new QTableWidgetItem(vecPoint[i]->mem2));
ui->tb_pointState->item(i,1)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
}
}
- 注:
- 在该实例中
vecPoint
为一结构体向量,即数据的组织形式类似于表格 setTextAlignment
方法填入单元格须为字符串形式,如果传入为数字,需要使用QString::number
方法转换
- 在该实例中
柱状图
- 示例程序
- 在
.pro
文件中添加内容
QT += core gui charts
- 在ui界面设计器添加控件 QWidget, 并提升为 QChart
//传入参数为表中所需数据
//每行为项目,每列为类别,数据以空格隔开
QString Form_linkstate::buildTable(QString fileName)
{
QString info = "";
// put the date from file to vector
// struct performance 为有着三个成员变量的结构体
QString tempStr;
QStringList tempStrList;
struct performance tempPerformance;
QFile aFile(fileName);
QTextStream aStream(&aFile);
if(!aFile.open(QIODevice::ReadOnly | QIODevice::Text))
return "文件"+fileName+"不存在";
while(!aStream.atEnd())
{
tempStr = aStream.readLine();
tempStrList = tempStr.split(" ");
tempPerformance.mem1 = tempStrList[0].toDouble();
tempPerformance.mem2 = tempStrList[1].toDouble();
tempPerformance.mem3 = tempStrList[2].toDouble();
vecPerformance.append(tempPerformance);
}
aFile.close();
// find the max value of vector
// 查找表中的最大值,美化后面的绘图部分
double MaxValue = 0.0;
for (int i=0;i<vecPerformance.size();i++) {
if(vecPerformance[i].mem1 > MaxValue)
MaxValue = vecPerformance[i].mem1;
if(vecPerformance[i].mem2 > MaxValue)
MaxValue = vecPerformance[i].mem2;
if(vecPerformance[i].mem3 > MaxValue)
MaxValue = vecPerformance[i].mem3;
}
// paint the table
QChart* chart = new QChart();
QBarSet *set0 = new QBarSet("类别1");
QBarSet *set1 = new QBarSet("类别2");
QBarSet *set2 = new QBarSet("类别3");
for (int i=0;i<vecPerformance.size();i++) {
*set0 << vecPerformance[i].mem1;
*set1 << vecPerformance[i].mem2;
*set2 << vecPerformance[i].mem3;
}
set0->setLabelColor(QColor(0,0,255));
set1->setLabelColor(QColor(0,0,255));
set2->setLabelColor(QColor(0,0,255));
QBarSeries *series = new QBarSeries();
series->append(set0);
series->append(set1);
series->append(set2);
series->setVisible(true);
series->setLabelsVisible(true);
series->setLabelsPosition(QAbstractBarSeries::LabelsOutsideEnd);
chart->addSeries(series);//添加系列到QChart上
chart->setTheme(QChart::ChartThemeLight);//设置白色主题
QBarCategoryAxis *axisX = new QBarCategoryAxis;
for (int i=0;i<vecPerformance.size();i++) {
axisX->append("项目"+QString::number(i));
}
axisX->setLabelsColor(QColor(7,28,96));
chart->addAxis(axisX, Qt::AlignBottom);
series->attachAxis(axisX);
QValueAxis *axisY = new QValueAxis;
axisY->setRange(0,MaxValue+0.02);
chart->addAxis(axisY, Qt::AlignLeft);
series->attachAxis(axisY);
axisY->setTitleText("指标");
chart->legend()->setVisible(true);
chart->legend()->setAlignment(Qt::AlignBottom);//底部对齐
chart->legend()->setBackgroundVisible(true);//设置背景是否可视
chart->legend()->setAutoFillBackground(true);//设置背景自动填充
chart->legend()->setColor(QColor(222,233,251));//设置颜色
chart->legend()->setLabelColor(QColor(0,100,255));//设置标签颜色
chart->legend()->setMaximumHeight(50);
ui->widget->setChart(chart);
return info;
}
参考内容
QT-QChart之曲线图,饼状图,条形图使用
https://www.cnblogs.com/lifexy/p/10985191.html
QTCharts入门 使用QChartView做折线图
https://blog.csdn.net/baizy77/article/details/84107786
更多内容
欢迎关注公众号,交流每日所见所想、学习经验