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