qt之扫码枪编码自动识别文本

本文介绍了如何使用扫码枪与QXlsx库配合,实现在输入编码后自动识别并对应到Excel文件中的名称,同时提供了两种版本的代码优化,以减少重复识别。适用于商业环境中的快速编码对应操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

使用扫码枪输入扫码后,自动将编码转为文字或识别进入下一功能。

只是简单的实现了一种方式,并不适用于商业用途

二、环境

扫码枪免驱自动扫码编码打印到输入库的环境下

三、正文

本文介绍也是输入一种方式,不限于非得扫码识别文本,可以扫码进入某项功能, 或扫码识别后干其他什么事情都可以。

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后会自动识别一次,如果没有时间限制,那么每一个字符输入整个文本都要被识别一次,会出现编码包含编码的编码无法被识别。

快去测试把。


20240105更新

发现之前的方法有一些不完美,就是不管在输入完毕没有只要有新的输入,200ms后就会进行一次识别,此方法也不是不可用,适用于复制粘贴过来的编码信息,或者扫码枪是直接一次过来全部数据的

下面更新的方式兼容和避免了上述重复识别,在输入一个一个字符后,只要在1秒之内就不会识别,只有输入字符间隔大于1秒才认为输入完毕,进行一次识别,因为有的扫码枪是将字符一个一个打印输入的,但是间隔在几十毫秒,所以此方法也能兼容上面的方式。

话不多说,上代码

 static char intime=0;//进入编码识别标志
    connect(ui->lineEdit_code,&QLineEdit::textChanged,[=](){
        intime=1;//有新的字符输入复位标志,继续等待输入,最多超时1秒
    });
    QTimer *time0=new QTimer(this);
    time0->start(100);
    connect(time0,&QTimer::timeout,[=](){
        if(intime>0)intime++;
        if(intime>10){//超时1秒未输入进入编码识别
            intime=0;
            //设备编码识别
            QString path="../res/code.xlsx";
            QFile file(path);
            if(!file.exists()){
                showtoast(0,QString("编码文件丢失!可前往设置界面新建和编辑编码文件code.xlsx"),3500,500);//弹出提示toast
            }
            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));
                        intime=0;//复位编码识别标志
                    }
                }
                if(havecode)
                    showtoast(0,QString("编码识别成功!自动更改匹配编码名称!"),3500,500);//弹出提示toast
                else if(!nowcode.isEmpty())//未识别编码 不为空
                    showtoast(0,QString("编码识别失败!未识别到扫描编码,可前往设置界面打开code.xlsx表格录入被测装备编码信息!"),3500,500);//弹出提示toast
            }
        }
    });

效果

四、结语

快去测试,早点休息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桶矿泉水

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值