一、前言
使用扫码枪输入扫码后,自动将编码转为文字或识别进入下一功能。
只是简单的实现了一种方式,并不适用于商业用途
二、环境
扫码枪免驱自动扫码编码打印到输入库的环境下
三、正文
本文介绍也是输入一种方式,不限于非得扫码识别文本,可以扫码进入某项功能, 或扫码识别后干其他什么事情都可以。
1.需要一个code.xlsx文档,来做扫码和识别后的文本对应关系
2.在ui界面创建一个QLineEdit控件
3.关键代码
使用QXlsx类创建模板文件
//扫描枪编码设置
//打开配置文件
connect(ui->btn_codeopen,&QPushButton::clicked,[=](){
QString path="../res/code.xlsx";
QFile file(path);
if(!file.exists())
massage_dialog(1,"提示","未找到code.xlsx编码文件!请新建code.xlsx文件!",1,30);
else{
QDesktopServices::openUrl(QUrl::fromLocalFile(path));
}
});
//新建配置文件
connect(ui->btn_codenew,&QPushButton::clicked,[=](){
QString path="../res/code.xlsx";
QFile file(path);
if(file.exists())
massage_dialog(1,"提示","新建code.xlsx失败!已存在code.xlsx文件!",1,30);
else{
QXlsx::Document xlsx;
//写大标题,标题在第一行
QXlsx::Format formatTitle;
formatTitle.setFontBold(true);// 粗体
formatTitle.setFontColor(QColor(Qt::black));//文字颜色
formatTitle.setFontSize(20);//字体大小
formatTitle.setBorderStyle(QXlsx::Format::BorderThin);//边框样式,细网格线
formatTitle.setPatternBackgroundColor(Qt::lightGray);//单元格背景色
formatTitle.setFillPattern(QXlsx::Format::PatternSolid);//填充样式
formatTitle.setHorizontalAlignment(QXlsx::Format::AlignHCenter);//文本水平居中
xlsx.write(1,1,"编码",formatTitle);
xlsx.write(1,2,"名称",formatTitle);
//写内容,从第二行开始,1-2列
QXlsx::Format format2;
format2.setBorderStyle(QXlsx::Format::BorderThin);//边框样式,细网格线
format2.setHorizontalAlignment(QXlsx::Format::AlignHCenter);//文本水平居中
xlsx.write(2,1,"1234500001",format2);
xlsx.write(2,2,"xxx件",format2);
bool res = xlsx.saveAs(path);
if(res)
massage_dialog(1,"提示","新建code.xlsx文件成功!请打开新建文件填入被测装备编码和名称,已自动填入一行示例信息,可删除。",1,30);
else
massage_dialog(1,"提示","新建code.xlsx文件失败!",1,30);
}
});
在使用界面初始化,自动识别文本并给出响应
QTimer *time1=new QTimer(this);
connect(ui->lineEdit_code,&QLineEdit::textChanged,[=](){
time1->start(200);
});
connect(time1,&QTimer::timeout,[=](){
time1->stop();
//设备编码识别
QString path="../res/code.xlsx";
QFile file(path);
if(!file.exists()){
//处理异常。。
}
else{
QStringList code_nums;code_nums.clear();
QStringList code_name;code_name.clear();
QXlsx::Document xlsx(path);
QXlsx::Workbook *workBook = xlsx.workbook();
QXlsx::Worksheet *workSheet = static_cast<QXlsx::Worksheet*>(workBook->sheet(0));
ulong xlsxrows=workSheet->dimension().rowCount();//读取文件行数
ulong xlsxcloums=workSheet->dimension().columnCount();//读取文件列数
for (int i=1;i<=xlsxrows;i++){
code_nums.append(workSheet->cellAt(i, 1)->value().toString());
code_name.append(workSheet->cellAt(i, 2)->value().toString());
}
code_nums.removeFirst();//去掉第一行标题行
code_name.removeFirst();//去掉第一行标题行
xlsx.deleteLater();
// qDebug()<<code_nums<<code_name;
QString nowcode=ui->lineEdit_code->text();//当前编码
bool havecode=false;//默认没有识别到编码
for(int i=0;i<code_nums.size();i++){
if(code_nums.at(i)==nowcode){
havecode=true;//识别到编码
ui->lineEdit_code->setText(code_name.at(i));
QTimer::singleShot(100,this,[=](){time1->stop();});//停止计时器,否则编码更改文本后又刷新一次
}
}
// if(havecode)
// massage_dialog(1,"提示","编码识别成功!自动修改编码对应被测装备!",1);
// else
// massage_dialog(1,"提示","编码识别失败!未找到扫描编码,请前往设置界面打开code.xlsx表格录入被测装备编码信息!",1);
}
});
大功告成,这样就实现了在200ms内输入完毕的编码,在200ms后会自动识别一次,如果没有时间限制,那么每一个字符输入整个文本都要被识别一次,会出现编码包含编码的编码无法被识别。
快去测试把。
四、结语
快去测试,早点休息