需求
- 在本地文件中读取学生分数信息,按照一定规则显示到界面中
- 支持数据动态加载,即本地文件更改后,可以动态地在界面上显示
- ......支持分数平均等小功能
本案例采用MVC设计模式,采用四层架构,从下往上即数据层(Data Source)、数据表示层(Data Object)、数据组织层(Model)、数据显示层(View)
系统架构图:
核心类图:
DataSource类设计:
——设置数据源并读取数据
——对数据解析后生成数据对象
DataSource.h
#ifndef DATASOURCE_H
/*
*数据源
*/
#ifndef DATASOURCE_H
#define DATASOURCE_H
#include <QObject>
#include <QList>
#include "ScoreInfo.h"
class DataSource : public QObject
{
Q_OBJECT
public:
explicit DataSource(QObject *parent = 0);
/*
* @bref: 设置数据源
* @param: 数据源路径(此处为待处理文本文件路径)
* @return: 成功返回true,反之false
*/
bool setDataPath(QString path);
/*
* @bref: 导出数据
* @param 无
* @return: QList<ScoreInfo>,数据对象列表
*/
QList<ScoreInfo> fetchData();
/*
* @bref: 返回数据条数
* @param: 无
* @return: 数据条数
*/
int count();
private:
/*
* @bref: 解析从数据源读取的数据
* @param 数据在文本中的行数,info为存取该条数据的对象,这里这里info一个引用,是输出
* @return: 成功返回true,反之false
*/
bool parse(QString line/*in*/, ScoreInfo& info/*out*/);
private:
QList<ScoreInfo> m_data;//存放解析来的数据
};
#endif // DATASOURCE_H
DataSource.cpp
#include <QDir>
#include <QTextStream>
#include "DataSource.h"
DataSource::DataSource(QObject *parent) : QObject(parent)
{
}
bool DataSource::setDataPath(QString path)
{
bool ret = true;
QFile file(path);
if(file.open(QIODevice::ReadOnly | QIODevice::Text))//只读方式打开文本
{
QTextStream in(&file);//以"流"的方式读取文件
while(!in.atEnd())
{
ScoreInfo info;
if(parse(in.readLine(), info)) //调用parse解析
{
m_data.append(info);
}
}
file.close();
}
else
{
ret = false;
}
return ret;
}
QList<ScoreInfo> DataSource::fetchData()
{
QList<ScoreInfo> ret = m_data;
m_data.clear(); //这一步主要是考虑到取出数据之后,这个容器的数据就不再使用,故清除。节省空间(如果数据来自网络)
return ret;
}
int DataSource::count()
{
return m_data.count();
}
bool DataSource::parse(QString line, ScoreInfo &info)
{
bool ret = true;
QStringList list = line.split(",", QString::SkipEmptyParts);//以","分割数据,去除空格
if(li