电机时序变化测量数据处理通常采用Excel来进行,很容易出错,且数据保存后时间长了也不知道什么意思。所以需要开发个专门计算电机时序变化量的小工具。这样就能保证不出错。
目录
1 需求
- 1 能加载多个数据文件。
- 2 能指定截止时间
- 3 能调整场值显示范围
- 4 能导出图片
- 5 能计算均方差
2 实现思路和技术栈
加载文件可以用listView来实现,截止时间的指定可以用lineEdit,绘图还是用QCustomPlot,功能操作就用目录实现,计算均方差需要用到容器。
3 开发流程
1 新建主窗口程序
用UI设计器摆放控件。不得不说Qt的UI设计器比Matlab的GUI真是方便多了。而且美观。
2 初始化
我们的文件一般不超过5个,用5组颜色就可以。
// 设置默认绘图颜色序列 蓝 青 绿 红 黄
colorList<<QColor(0,0,255)<<QColor(0,255,255)<<QColor(0,255,0)<<QColor(255,0,0)<<QColor(255,255,0);
之后对模型视图初始化,再设置初始参数。
// 设置右键菜单
menu = new QMenu(this);
menu->addAction("Set Color", this, SLOT(slotSetColor()));
menu->addAction("Open Directory", this, SLOT(slotOpenDir()));
ui->listView->setContextMenuPolicy(Qt::CustomContextMenu);
// 模型视图
model = new QStringListModel;
ui->listView->setModel(model);
// 默认参数
ui->pngWidth->setText(QString::number(500));
ui->pngHeight->setText(QString::number(300));
3 打开文件
用action打开文件,并显示在列表清单。打开文件后,要获取时间和场值范围,同时时间绘图功能。
// 逐个文件读取并绘图
tim.clear();
val.clear();
ui->plot->clearGraphs();
QVector<double> xmin,xmax,ymin,ymax;
for(int i = 0; i<files.count(); i++)
{
// 读取时间和测量值 形成x和y
QFile file(files.at(i));
if(!file.open(QIODevice::ReadOnly))
return;
QTextStream in(&file);
QString line;
QVector<double> x,y;
line = in.readLine();
line = in.readLine();
line = in.readLine();
QStringList info = line.split(" ");
QString name = info.at(3).right(3);
line = in.readLine();
line = in.readLine();
line = in.readLine();
line = in.readLine();
while(!in.atEnd()){
line = in.readLine();
QStringList list = line.split(" ",QString::SkipEmptyParts);
double time = list.at(0).toDouble();
x<<hms2dec(time)/3600.0;
y<<list.at(1).toDouble();
}
file.close();
/