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

一、前言

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

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

二、环境

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

三、正文

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

1.需要一个code.xlsx文档,来做扫码和识别后的文本对应关系

qt之扫码枪编码自动识别文本_第1张图片

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(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()<lineEdit_code->text();//当前编码
            bool havecode=false;//默认没有识别到编码
            for(int i=0;ilineEdit_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后会自动识别一次,如果没有时间限制,那么每一个字符输入整个文本都要被识别一次,会出现编码包含编码的编码无法被识别。

快去测试把。

四、结语

快去测试,早点休息

你可能感兴趣的:(#,qt数据处理/算法类,qt,开发语言,qt扫码识别)