QT实现无线条码枪数据采集(一)

最近做项目中遇到需要采集产品的条形码和二维码进行保存显示,并上传服务器或企业ERP系统,于是针对无线扫码枪和二维码扫码枪做了数据采集测试。
扫码枪本身是一个输入设备,类似键盘输入。条码都是ASCII字符,最后一个字符为回车键,一般扫码枪连接电脑后,光标焦点放在编辑框,扫码后数据就会自动输入到编辑框,本文主要讲解如何在没有编辑框的时候,通过拦截WM_CHAR消息获取输入条码的具体数据。

1、软硬件配置

  • 科密无线扫码枪(条形码),型号:YX-38
  • 软件环境 Qt5.9.6

2、解决思路

1.一般扫码枪是通过串口进行采集,其优点是可实现无焦点采集,可循环存到一个固定的内存地址,缺点是串口必须接一根串口线,用户体验不太好;
2.Qt采用键盘事件来判别条形码输入的具体内容,因此可以通过监听虚拟键盘的输入来判定扫码枪的输入,从而实现无焦点采集。

扫码枪设置.jpg

上图是扫码枪设置的图,可以设置不同的工作模式,在扫码枪超出无线传输的距离范围后,可以使用盘点模式,这样扫码数据就保存到扫码枪,盘点完成后再扫数据上传,这样就可以实现离线的货物盘点了,这一点还是比较人性化的,不过这些工作模式我这里没有一一测试。

3、具体代码实现

3.1 Qt自带的键盘事件QEvent::KeyPress

private slots:
    //申明KeyPress函数
    void keyPressEvent(QKeyEvent* event);

以上是头文件的函数申明,其具体实现代码如下:

void Widget::keyPressEvent(QKeyEvent* event)
{
    switch(event->key())
        {
            case Qt::Key_Down:
            {
                qDebug()<<"ok";
            }
                break;
            case Qt::Key_F1:
            {
                qDebug()<<"ssss";
            }
        }
    if (0x30 <= event->key() && 0x39 >= event->key())
       {
        char st=event->key();
        QString str_ascii = QString(st);
        qDebug()<<str_ascii;
        qDebug()<<event->key();
       }
     else if (0x41 <= event->key() && 0x48 >= event->key())
       {
       qDebug()<<event->key();
       }else
       {
       qDebug()<<event->key();
       }
}

键盘事件中的按键对应值如下表所示:


键盘对应键值.png

3.2 自己写全局的键盘监测函数

使用notify()函数来实现键盘的监控

bool GlobalApplication::notify(QObject *obj, QEvent *e)
{
    const QMetaObject* objMeta = obj->metaObject();
    QString clName = objMeta->className();
//    qDebug()<<clName;

//if(clName == "Form")
//    {
    if(e->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
            if(keyEvent->key() == 16777220)
            {
                qDebug()<<strinput;
                qDebug() << clName;
                strinput.clear();
            }
            else
            {
                char st=keyEvent->key();
                QString str_ascii = QString(st);
                strinput +=str_ascii;
 //               qDebug()<<strinput;
            }
            return true;
         }
//}

//if(clName == "QWidgetWindow")
//{
//    if(e->type() == QEvent::KeyPress)
//    {
//        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
//        if(keyEvent->key() == Qt::Key_F1)
//        {
//            qDebug() << clName;
//            qDebug() << "F1";
//        }
// //     widget->keyPress(keyEvent);
//     }
//    else if(e->type() == QEvent::MouseButtonPress)
//    {
//        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(e);
//        if(mouseEvent->buttons() == Qt::LeftButton)
//        qDebug() << "left";
//    }
//}

    return QApplication::notify(obj,e);
}

这个函数也可用作鼠标的监控,其中注释的部分涉及到鼠标的监控。全局监控需要在main.cpp文件里,设定为全局类GlobalApplication

int main(int argc, char *argv[])
{
    GlobalApplication a(argc, argv);
 //   QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

3.3 附上全部代码及测试效果

globalapplication.h

#ifndef GLOBALAPPLICATION_H
#define GLOBALAPPLICATION_H
#include<QApplication>

class GlobalApplication : public QApplication
{
public:
    GlobalApplication(int&argc,char **argv);
    ~GlobalApplication();

    bool notify(QObject*,QEvent *);
    void setWindowInstance(QWidget *wnd);
private:
    QWidget *widget;
       QString strinput;
};

#endif // GLOBALAPPLICATION_H

globalapplication.cpp

#include "globalapplication.h"
#include <QApplication>
#include <QKeyEvent>
#include <QDebug>

GlobalApplication::GlobalApplication(int &argc,char **argv):
QApplication(argc,argv)
{

}

GlobalApplication::~GlobalApplication()
{

}

void GlobalApplication::setWindowInstance(QWidget *wnd)
{
    widget = wnd;
}

bool GlobalApplication::notify(QObject *obj, QEvent *e)
{
    const QMetaObject* objMeta = obj->metaObject();
    QString clName = objMeta->className();
//    qDebug()<<clName;

//if(clName == "Form")
//    {
    if(e->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
            if(keyEvent->key() == 16777220)
            {
                qDebug()<<strinput;
                qDebug() << clName;
                strinput.clear();
            }
            else
            {
                char st=keyEvent->key();
                QString str_ascii = QString(st);
                strinput +=str_ascii;
 //               qDebug()<<strinput;
            }
            return true;

         }

//}

//if(clName == "QWidgetWindow")
//{
//    if(e->type() == QEvent::KeyPress)
//    {
//        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
//        if(keyEvent->key() == Qt::Key_F1)
//        {
//            qDebug() << clName;
//            qDebug() << "F1";
//        }
// //     widget->keyPress(keyEvent);
//     }
//    else if(e->type() == QEvent::MouseButtonPress)
//    {
//        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(e);
//        if(mouseEvent->buttons() == Qt::LeftButton)
//        qDebug() << "left";
//    }
//}


    return QApplication::notify(obj,e);

}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "dialog.h"
#include "form.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    Dialog *p_dialog;
    Form *p_form;

private slots:

    void on_pushButton_Load_clicked();
    void on_pushButton_test_clicked();
    void keyPressEvent(QKeyEvent* event);
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "dialog.h"
#include <QDebug>
#include<QKeyEvent>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    p_dialog = NULL;
    p_form = NULL;
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_Load_clicked()
{
    if(p_dialog == NULL)
    {
        p_dialog =new Dialog();
        p_dialog->setWindowTitle(QString::fromLocal8Bit("虚拟键盘测试"));
        p_dialog->show();
        qDebug()<<"Test"<<endl;
    }
    else
    {
        p_dialog->show();

    }
}

void Widget::on_pushButton_test_clicked()
{
    if(p_form == NULL)
    {
        p_form =new Form();
        p_form->setWindowTitle(QString::fromLocal8Bit("测试"));
        p_form->show();
//        qDebug()<<"Test"<<endl;
    }
    else
    {
        p_form->show();

    }
}

void Widget::keyPressEvent(QKeyEvent* event)
{
    switch(event->key())
        {
            case Qt::Key_Down:
            {
                qDebug()<<"ok";
            }
                break;
            case Qt::Key_F1:
            {
                qDebug()<<"ssss";
            }
        }


//    if (0x30 <= event->key() && 0x39 >= event->key())
//       {
//        char st=event->key();
//        QString str_ascii = QString(st);
//        qDebug()<<str_ascii;

//           qDebug()<<event->key();
//       }
//       else if (0x41 <= event->key() && 0x48 >= event->key())
//       {

//       qDebug()<<event->key();
//       }
//       else
//       {

//       qDebug()<<event->key();
//       }

}
不同窗口下键盘输入结果.png
键盘输入监控.png
扫码枪扫码结果输出.png

3.4 代码仓库

码云仓库地址
下一节内容 如何区分键盘输入还是扫码枪输入。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351