Qt实现区分扫码输入和用户输入

USB口的扫码设备实际上就是一个键盘,只不过扫码成功后一连窜输入的间隔极小,而用户输入停顿较长,所以以下根据输入间隔区分扫码输入或是用户输入。

头文件:mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QKeyEvent>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

protected:
    virtual void keyPressEvent(QKeyEvent *e);

private slots:
    void on_pushButton_clicked();
    void keyBoardInput();

private:
    Ui::MainWindow *ui;
    QTimer *m_KeyTimer;
    QString strbar;
    QString m_currKey;
    void showscanCode(const QString &code);
};

#endif // MAINWINDOW_H

源文件:mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    m_KeyTimer(NULL),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //用于区分扫码键值和用户输入键值
    //输入间隔在50毫秒以内,为扫码输入 否则为用户输入
    m_KeyTimer = new QTimer(NULL);  //创建定时器
    m_KeyTimer->setInterval(50);    //设置定时器间隔50毫秒
    m_KeyTimer->setSingleShot(true);//设置定时器为一次性定时器
    connect(m_KeyTimer, SIGNAL(timeout()), this, SLOT(keyBoardInput()));
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::keyPressEvent(QKeyEvent *e)
{
    if ( e->isAutoRepeat() )    return;
    qDebug()<<"m_KeyTimer_isActive"<<m_KeyTimer->isActive();
    //如果有按键事件,先判断定时器是否存在(是否在50毫秒间隔内)
    if(m_KeyTimer->isActive())
    {//如果是算做扫码输入
        //扫码输入以回车键为结束
        if(e->key() == Qt::Key_Return)
        {
            qDebug() << strbar;
            showscanCode(strbar);
            strbar.clear();
        }
        else
        {   //进行键值累加
            if(strbar.isEmpty()){
                strbar = m_currKey;
            }
            strbar += e->text();
        }
    }
    m_currKey  =  e->text();
    m_KeyTimer->start();
}

void MainWindow::on_pushButton_clicked()
{
    ui->textEdit_userinput->clear();
    ui->textEdit_scancode->clear();
}

void MainWindow::keyBoardInput()
{
    ui->textEdit_userinput->insertPlainText(m_currKey);
}

void MainWindow::showscanCode(const QString &code)
{
    ui->textEdit_scancode->setText(code);
}

main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"

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

    return a.exec();
}

这里写图片描述
此方式适用部分情景。大家如果有更好的方式还请分享探讨~

源码地址:
http://t.cn/RiZ06Ja

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值