Russian Qt Forum
Ноябрь 24, 2024, 22:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Чтение штрихкода  (Прочитано 6472 раз)
Hvzh
Гость
« : Октябрь 14, 2014, 16:10 »

Доброго времени суток!

Имеется считыватель штрихкода, который система воспринимает как клавиатуру и передает считанные данные в stdin. Необходимо считать штрихкод из приложения Qt. С консольным вариантом проблем нет, а вот как считать их из гуишного приложения? Может, кто-нибудь может поделиться примером?
« Последнее редактирование: Октябрь 15, 2014, 11:35 от Hermann » Записан
OKTA
Гость
« Ответ #1 : Октябрь 14, 2014, 16:13 »

 Смеющийся А что мешает сделать работающее консольное приложение гуишным?  Смеющийся
Записан
Hvzh
Гость
« Ответ #2 : Октябрь 14, 2014, 16:41 »

Смеющийся А что мешает сделать работающее консольное приложение гуишным?  Смеющийся
Может, и ничего, может, я недопонимаю чего-то.
Вот консольная:

Код:
#include <QTextStream>

void write(const char* text="", const int enter=0);
QTextStream output(stdout);
QTextStream input(stdin);

int main(){
    char command[]="";
    while (QString(command)!="exit"){
    write("Scan code: ");
    input >> command;
    qDebug() << "Code = " << command;
    }
    return 0;

}

void write(const char* text, const int enter){
    output << QString::fromUtf8(text);
    for (int i(0); i<=enter-1; i++){
           output  << "\n";
    }
    output.flush();
}

Вывод в консоль:
Код:
Scan code: 46106025
Code = 46106025

Однако, когда я пытаюсь вставить что-либо подобное в QDialog, например, то он замыкает весь ввод на себя, и мой код не работает. Вот так, например, я пытался это имплементировать:

.cpp
Код:
#include <QTextStream>
#include <QDebug>


BarcodeReader::BarcodeReader(QObject *parent) :
    QObject(parent),
    notifier(0, QSocketNotifier::Read)
{
    connect(&notifier, SIGNAL(activated(int)), this, SLOT(text()));
}

void BarcodeReader::text()
{
    QTextStream qin(stdin);
    QString line = qin.readLine();
    qDebug() << "BarcodeReader::text = " << line;
    emit textReceived(line);
}

.h
Код:
#include <QObject>
#include <QSocketNotifier>

class BarcodeReader : public QObject
{
    Q_OBJECT
public:
    explicit BarcodeReader(QObject *parent = 0);
signals:
    void textReceived(QString message);
public slots:
    void text();
private:
    QSocketNotifier notifier;
};
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Октябрь 14, 2014, 16:46 »

    char command[]="";
    ...
    input >> command;

Ой-вей, тут же память бьётся.

Сканер эмулирующий клавиатуру посылает обычные QKeyEvent, которые ты можешь ловить в своём приложении. Чтение stdin тут не поможет, потому что нет терминала, куда посылается клавиатурный ввод со сканера. Проблема ещё в том чтобы отличить ввод со сканера от ввода с реальной клавиатуры.
Записан
Hvzh
Гость
« Ответ #4 : Октябрь 14, 2014, 16:52 »

    char command[]="";
    ...
    input >> command;

Ой-вей, тут же память бьётся.

Сканер эмулирующий клавиатуру посылает обычные QKeyEvent, которые ты можешь ловить в своём приложении. Чтение stdin тут не поможет, потому что нет терминала, куда посылается клавиатурный ввод со сканера. Проблема ещё в том чтобы отличить ввод со сканера от ввода с реальной клавиатуры.
Знаю, что бьется, бог с ней. Мне не нужно отличать ввод со сканера от ввода с клавиатуры, софт подразумевается эксплуатировать только с мышой. А по поводу QKeyEvent - вот как это реально сделать? Я в событиях всяких Qt-шных пока еще не сильно разобрался Грустный
Записан
Hvzh
Гость
« Ответ #5 : Октябрь 14, 2014, 16:57 »

Насколько я понимаю, при, например, нажатии кнопки "Сосканить код" мне нужно замкнуть клавиатурный ввод на какой-то свой виджет, дождаться окончания скана и после этого снова разблокировать ввод. Я нагуглил один пример, но в упор не понимаю, как его использовать:

Код:
class KeyPressEater:public QObject{
    Q_OBJECT
protected:
    bool eventFilter(QObject *obj, QEvent *event){
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            qDebug("Ate key press %d", keyEvent->key());
            if(keyEvent->key()==Qt::Key_Enter||keyEvent->key()==Qt::Key_Return){
                barCode=tempCode;
                tempCode.clear();
                qDebug()<<barCode;
                QString tmp="Штрих код был успешно считан устройством. Номер:"+barCode;
                QMessageBox::information(NULL,"Bar code",tmp);
                return true;
            }
            tempCode+=keyEvent->key();
            return true;
        } else {
            return QObject::eventFilter(obj, event);
        }
    }
private:
    QString tempCode,barCode;
};
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Октябрь 14, 2014, 16:58 »

Знаю, что бьется, бог с ней. Мне не нужно отличать ввод со сканера от ввода с клавиатуры, софт подразумевается эксплуатировать только с мышой. А по поводу QKeyEvent - вот как это реально сделать? Я в событиях всяких Qt-шных пока еще не сильно разобрался Грустный

Так вообще тогда делать нечего - переопредели http://qt-project.org/doc/qt-4.8/qwidget.html#keyPressEvent в своём главном виджете, и ты будешь ловить клавиатурные нажатия.
Записан
Hvzh
Гость
« Ответ #7 : Октябрь 15, 2014, 11:35 »

Всем спасибо! Разобрался, все работает
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 23.