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 代码仓库
码云仓库地址
下一节内容 如何区分键盘输入还是扫码枪输入。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt(C++图形用户界面框架)可用于实现超声数据采集的上位机界面。超声数据采集作为一种非破坏性检测方法,主要用于检测物体的内部结构,如裂纹、气泡、材料缺陷等。 首先,我们可以使用Qt提供的窗口部件(QWidget)和布局管理器(QLayout)来设计用户界面。可以使用窗口部件来创建主窗口,并将按钮、文本框、图表等控件放置在合适的位置。布局管理器可以帮助我们方便地调整控件的位置和大小。 接下来,可以使用Qt提供的串口通信类(QSerialPort)来与超声设备进行通信。我们可以使用其功能来打开、关闭串口连接,发送和接收数据。通过与超声设备进行通信,我们可以控制数据采集的开始和结束,以及接收和显示采集到的数据。 为了实现实时数据显示,我们可以使用Qt提供的绘图类(QPainter、QPaintDevice和QImage)来绘制图表。每次接收到新数据时,我们可以将其添加到绘图区域,并实时更新界面显示。可以使用曲线、柱状图等不同的绘图方法来展示数据。 此外,我们可以使用Qt提供的文件操作类(QFile、QTextStream)来保存和加载采集数据。可以将采集到的数据保存到本地文件中,以便后续分析和处理。 最后,我们可以在用户界面中添加设置选项,如采样率、采集时间、数据格式等。用户可以根据需要进行这些设置,并通过界面上的按钮来控制数据采集的过程。 总之,使用Qt实现超声数据采集的上位机界面需要利用Qt的窗口部件、布局管理器、串口通信、绘图、文件操作等功能,并结合超声设备的通信协议和数据格式进行开发。通过合理的界面设计和功能实现,我们可以方便地控制超声数据采集过程并实时显示采集数据,实现一个功能完善的上位机界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值