目录
运行环境:win7+Qt5.14+mingw32
1、项目需求
1) 显示录入成功,未成功提示
2) 列表列出每条录入数据
3) 可调阅历史数据
4) 调取 MES 系统编号数据以供扫描。
2、软件工作流程
产品放在测试工位---->首次扫码枪扫去产品SN---->读取传感器数据(测试设备数据)----->数据(json格式数据)上传致MES服务器------>服务器返回测试数据OK/NG---------->数据保存本地
3、软件图片
主界面扫码
历史数据浏览
4、部分源码(主界面和配置页面代码)
逻辑流程代码暂时不外发
#include "mainwidget.h"
#include "ui_mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MainWidget)
{
ui->setupUi(this);
connect(ui->lb_Wdt_Act, SIGNAL(setQlabel()), this, SLOT(setQalbelSlot()));
connect(&Dev,SIGNAL(SendApiData()),this,SLOT(recvApiData()));
InitCtl();
connect(ui->btn_Set_Scan,&QPushButton::clicked,[=](){
Dev.s_Scn.Port=ui->cbx_Scan_Port->currentText();
Dev.s_Scn.BaudRate=ui->cbx_Scan_Bt->currentText().toInt();
Cfg.WriteParam("Scan","Port",Dev.s_Scn.Port);
Cfg.WriteParam("Scan","BaudRate",Dev.s_Scn.BaudRate);
});
connect(ui->btn_Set_Wdt,&QPushButton::clicked,[=](){
Dev.s_Wdt.Port=ui->cbx_Wtd_Port->currentText();
Dev.s_Wdt.BaudRate=ui->cbx_Wdt_Bt->currentText().toInt();
Cfg.WriteParam("Wdt","Port",Dev.s_Wdt.Port);
Cfg.WriteParam("Wdt","BaudRate",Dev.s_Wdt.BaudRate);
});
connect(ui->btn_Set_Mes,&QPushButton::clicked,[=](){
Dev.MesAddr=ui->text_Mes_Addr->text();
Dev.DevAddr=ui->text_Dev_Addr->text();
Dev.isMes=ui->cBx_isMes->isChecked();
Cfg.WriteParam("Mes","Http",Dev.MesAddr);
Cfg.WriteParam("Mes","Sn",Dev.DevAddr);
Cfg.WriteParam("Mes","UpMes",Dev.isMes);
});
connect(ui->btn_Set_Record,&QPushButton::clicked,[=](){
//打开目录
QString FileName = QFileDialog::getExistingDirectory(this,tr("请选择记录目录"),"");
if(!FileName.isEmpty())
{
Dev.RecordPath=FileName;
ui->lb_Record_Path->setText(Dev.RecordPath);
Cfg.WriteParam("Record","Path",Dev.RecordPath);
}
});
connect(ui->btn_Set_Title,&QPushButton::clicked,[=](){
Title=ui->text_Title->text();
Cfg.WriteParam("Title","Name",Title);
setWindowTitle(Title);
});
ui->dateEdit_DayTime->setDate(QDate::currentDate());
QTimer *RunTimer=new QTimer();
connect(RunTimer,SIGNAL(timeout()),this,SLOT(slotTimer()));
RunTimer->start(100);
ui->tabWidget->setCurrentIndex(0);
}
MainWidget::~MainWidget()
{
Dev.StopProcess();
delete ui;
}
void MainWidget::InitCtl()
{
QStringList BaudRateList{"9600","19200","38400","115200"};
ui->cbx_Scan_Bt->addItems(BaudRateList);
ui->cbx_Wdt_Bt->addItems(BaudRateList);
//主表格
ui->table_Main->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->table_Main->setEditTriggers(QAbstractItemView::NoEditTriggers);
QTableWidgetItem *headerItemM;
QStringList headerText;
headerText << tr("SN") << tr("重量")<<tr("结果")<<tr("时间");
ui->table_Main->setColumnCount(headerText.count()); //设置列数
QFont font;
font.setFamily("Microsoft YaHei");
font.setPixelSize(18);
for (int i = 0; i < ui->table_Main->columnCount(); i++)
{
headerItemM = new QTableWidgetItem(headerText.at(i));
headerItemM->setFont(font);
headerItemM->setFont(headerItemM->font());
ui->table_Main->setHorizontalHeaderItem(i, headerItemM);
}
//查询页面
ui->table_Q->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->table_Q->setEditTriggers(QAbstractItemView::NoEditTriggers);
QTableWidgetItem *headerItemQ;
ui->table_Q->setColumnCount(headerText.count()); //设置列数
for (int i = 0; i < ui->table_Main->columnCount(); i++)
{
headerItemQ = new QTableWidgetItem(headerText.at(i));
headerItemQ->setFont(font);
headerItemQ->setFont(headerItemQ->font());
ui->table_Q->setHorizontalHeaderItem(i, headerItemQ);
}
for (int i = 0; i < ShowRows; i++)
{
ui->table_Main->insertRow(i);
ui->table_Main->setRowHeight(i,25);
ui->table_Q->insertRow(i);
ui->table_Q->setRowHeight(i,25);
}
QStringList ComInfor;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
//添加信息
//if(info.manufacturer().contains("FTDI"))
ComInfor.append(info.portName());
}
ui->cbx_Scan_Port->addItems(ComInfor);
ui->cbx_Wtd_Port->addItems(ComInfor);
Dev.s_Scn.Port=Cfg.ReadParam("Scan","Port").toString();
Dev.s_Scn.BaudRate=Cfg.ReadParam("Scan","BaudRate").toInt();
ui->cbx_Scan_Port->setCurrentText(Dev.s_Scn.Port);
ui->cbx_Scan_Bt->setCurrentText(QString("%1").arg(Dev.s_Scn.BaudRate));
Dev.s_Wdt.Port=Cfg.ReadParam("Wdt","Port").toString();
Dev.s_Wdt.BaudRate=Cfg.ReadParam("Wdt","BaudRate").toInt();
ui->cbx_Wtd_Port->setCurrentText(Dev.s_Wdt.Port);
ui->cbx_Wdt_Bt->setCurrentText(QString("%1").arg(Dev.s_Wdt.BaudRate));
Dev.MesAddr=Cfg.ReadParam("Mes","Http").toString();
ui->text_Mes_Addr->setText(Dev.MesAddr);
Dev.DevAddr=Cfg.ReadParam("Mes","Sn").toString();
ui->text_Dev_Addr->setText(Dev.DevAddr);
Dev.isMes=Cfg.ReadParam("Mes","UpMes").toBool();
ui->cBx_isMes->setChecked(Dev.isMes);
Dev.RecordPath=Cfg.ReadParam("Record","Path").toString();
ui->lb_Record_Path->setText(Dev.RecordPath);
Title=Cfg.ReadParam("Title","Name").toString();
ui->text_Title->setText(Title);
setWindowTitle(Title);
}
//开始停止按钮
void MainWidget::on_pBtn_Start_clicked()
{
if(!isStarted)
{
ui->pBtn_Start->setText("停止");
Dev.StartProcee();
isStarted=true;
}
else
{
ui->pBtn_Start->setText("开始");
Dev.StopProcess();
isStarted=false;
}
}
void MainWidget::slotTimer()
{
//状态显示
switch (Dev.ProcessStep)
{
case eSTEP::Init:
ui->label_Step->setText("初始化……");
break;
case eSTEP::Scan:
ui->label_Step->setText("扫码枪就绪");
break;
case eSTEP::ReadF:
ui->label_Step->setText("读取重量");
break;
case eSTEP::GetHttp:
ui->label_Step->setText("等待MES反馈");
break;
case eSTEP::SaveCsv:
ui->label_Step->setText("数据保存");
break;
default:
break;
}
//数值显示
ui->Scan_Num->setText(Dev.s_Pdt.ID);
ui->lb_Wdt->setText(Dev.s_Pdt.F);
ui->lb_Wdt_Act->setText(Dev.FAct+"Kg");
ui->lb_Count->setText(QString("%1").arg(Dev.PdtCount));
//故障显示
ui->lb_ErrState->setText(Dev.ErrInfor);
}
//webApi信息
void MainWidget::recvApiData()
{
//显示结果
ui->label_MES_Result->setText(Dev.s_Pdt.Rlt);
if(Dev.s_Pdt.Rlt=="OK")
{
ui->label_MES_Result->setStyleSheet("background-color: rgb(0, 255, 0);");
}
else if (Dev.s_Pdt.Rlt.contains("NG"))
{
ui->label_MES_Result->setStyleSheet("background-color: rgb(255, 0, 0);");
}
else
{
ui->label_MES_Result->setStyleSheet("background-color: rgb(255, 255, 127);");
}
//插入表
ui->table_Main->insertRow(0);
ui->table_Main->setItem(0, 0, new QTableWidgetItem (Dev.s_Pdt.ID));
ui->table_Main->item(0,0)->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
ui->table_Main->setItem(0, 1, new QTableWidgetItem (Dev.s_Pdt.F));
ui->table_Main->item(0,1)->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
ui->table_Main->setItem(0, 2, new QTableWidgetItem (Dev.s_Pdt.Rlt));
ui->table_Main->item(0,2)->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
if(Dev.s_Pdt.Rlt=="OK")
{
ui->table_Main->item(0,2)->setBackgroundColor(QColor("#00FF00"));
}
else
{
ui->table_Main->item(0,2)->setBackgroundColor(QColor("#FF0000"));
}
ui->table_Main->setItem(0, 3, new QTableWidgetItem (Dev.s_Pdt.TimeAt));
ui->table_Main->item(0,3)->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
if(ui->table_Main->rowCount()>100)
ui->table_Main->removeRow(100);
}
//查询数据
void MainWidget::on_dateEdit_DayTime_userDateChanged(const QDate &date)
{
QString csvFile=QString("%1/%2.csv").arg(Dev.RecordPath).arg(date.toString("yyyy-MM-dd"));
QFile file(csvFile);
if (!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
qDebug() <<csvFile+" open failed";
ui->lb_Q_Count->setText("--");
ui->lb_OK_Count->setText("--/--");
ui->table_Q->clearContents();
HisList.clear();
}
else
{
HisList.clear();
int OKCount=0;
int NGCount=0;
// 文本流模式读取文件
QTextStream in(&file);
while (!in.atEnd())
{
QString strline = in.readLine();
if (!strline.contains(','))
continue;
QStringList _lst = strline.split(",");
if(_lst.count()!=4)
continue;
HisList.append(SProduct(_lst[0],_lst[1],_lst[2],_lst[3]));
if(_lst[2]=="OK") OKCount++; else NGCount++;
}
//设置数量
ui->lb_Q_Count->setText(QString("%1").arg(OKCount+NGCount));
ui->lb_OK_Count->setText(QString("%1/%2").arg(OKCount).arg(NGCount));
//展示第一页
TablePageS=HisList.count()/ShowRows; //总页数
if(HisList.count()%ShowRows>0) TablePageS++;
DisHistList();
}
file.close();
}
void MainWidget::on_btn_Up_Page_clicked()
{
TablePage--;
if(TablePage<0) TablePage=0;
DisHistList();
}
void MainWidget::on_btn_Dn_Page_clicked()
{
TablePage++;
if(TablePage>=TablePageS) TablePage=TablePageS-1;
DisHistList();
}
void MainWidget::setQalbelSlot()
{
Dev.isClearWdt=true;
}
void MainWidget::DisHistList()
{
if(HisList.count()==0) return;
int leng=(TablePage*ShowRows+ShowRows>=HisList.count())? HisList.count():TablePage*ShowRows+ShowRows;
QFont font;
font.setFamily("Microsoft YaHei");
font.setPixelSize(13);
ui->table_Q->clearContents();
ui->lb_Pages->setText(QString("%1/%2").arg(TablePageS).arg(TablePage+1));
for (int i=TablePage*ShowRows;i<leng;i++)
{
QColor bcolor;
if(i%2==0)
bcolor=Qt::cyan;
else
bcolor=Qt::white;
QTableWidgetItem *item0 = new QTableWidgetItem();
item0->setText(HisList.at(i).ID);
item0->setFont(font);
item0->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
item0->setBackground(bcolor);
ui->table_Q->setItem(i-TablePage*ShowRows, 0, item0);
QTableWidgetItem *item1 = new QTableWidgetItem();
item1->setFont(font);
item1->setText(HisList.at(i).F);
item1->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
item1->setBackground(bcolor);
ui->table_Q->setItem(i-TablePage*ShowRows, 1, item1);
QTableWidgetItem *item2 = new QTableWidgetItem();
item2->setFont(font);
item2->setText(HisList.at(i).Rlt);
item2->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
item2->setBackground(HisList.at(i).Rlt=="OK"? QColor("#00FF00"):QColor("#FF0000"));
ui->table_Q->setItem(i-TablePage*ShowRows, 2, item2);
QTableWidgetItem *item3 = new QTableWidgetItem();
item3->setFont(font);
item3->setText(HisList.at(i).TimeAt);
item3->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
item3->setBackground(bcolor);
ui->table_Q->setItem(i-TablePage*ShowRows, 3, item3);
}
}