QT - USB-Input



  • Hi zusammen

    ich schreibe eine Software für meinen Verein. Wir scannen dort Daten von Wettkampfteilenehmern über Barcodes ein.

    Ich habe leider in QT noch nie mit USB-Devices gearbeitet, geschweige denn jemals mit Barcodescannern.

    Was derzeit schon funktioniert: Der Scanner schreibt automatisch den Code in eine Komponente, die aktuell den Focus hat. Das ist mir aber zu unpraktisch.

    Ich würde das Scannen gern "unsichtbar" vornehmen. So dass von jedem Punkt der Anwendung sofort erkannt wird, dass ein Wertungszettel gescanned wurde, d.h. ich will nicht vom Benutzer erwarten, dass er den Focus in eine bestimmte Komponente setzt.

    Kennt sich jemand mit QT-USB-Support oder Barcodes aus? 😉



  • Qt weiß nichts von USB, da gibts nichts. Aber ich glaub, diese Barcode Scanner emulieren einfach eine Tastatur. D.h., du kannst in einer Komponente ohne Ausgabe auf die key*Events reagieren. So ganz im Hintergrund wird wahrscheinlich schwierig. Unter Windows könntest du einen Hook installieren. Ist aber alles plattformspezifisch und nicht Qt-bezogen. Und eigentlich auch nicht gut. Alle Programme, die irgendwas mit Barcode Scannern machen, die ich bisher gesehen habe, bringen schon ein Fenster wo dran steht, jetzt bitte scannen.



  • Mechanics schrieb:

    Qt weiß nichts von USB, da gibts nichts. Aber ich glaub, diese Barcode Scanner emulieren einfach eine Tastatur.

    Oder der scanner treiber simuliert eine serielle schnittstelle



  • Das habe ich befürchtet.

    Ich habe daher jetzt versucht, ein keyPressEvent zu basteln, aber da kommt nur Schrott rein. Es kommt was rein, aber nix lesbares irgendwie. Ich habe
    QKeyEvent::key() und QKeyEvent::text() ausgewertet, aber beides ist Schrott, in jedem Fall kein druckbares Zeichen.

    Hat jemand noch ne bessere Idee, was das Abfangen von Tastatursignalen betrifft?

    Ansonsten muss ichs halt mit einem LineEdit und Focus machen, was ich ja eigentlich explizit nicht wollte 😞



  • Ich habe jetzt eine brauchbare Lösung gefunden.

    Ich hab einen eventFilter in mein ApplicationObjekt installiert, welches bestimmte Zeichen abfängt. Nun muss ich nur noch dafür sorgen, dass jeder Barcode mit einem bestimmten Zeichen beginnt, was sonst in der Applikation nicht vorkommt und ich habe quasi mein Signal fürs einscannen.



  • Works as intended. 🙂

    #include <QObject>
    #include <QEvent>
    #include <QKeyEvent>
    
    class KeyPressEater : public QObject
    {
        Q_OBJECT
    public:
        explicit KeyPressEater( char start, char end )
            : QObject( 0 ), StartSign( start ), EndSign( end ), Text( "" ) {}
        virtual ~KeyPressEater() {}
    
    signals:
        void sigCatchingFinished( QString );
    
    protected:
        bool eventFilter(QObject *obj, QEvent *event )
        {
            bool Catched = false;
            if ( event->type() == QEvent::KeyPress )
            {
                QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
                if ( keyEvent && keyEvent->key() > 0 && keyEvent->key() < 128 )
                {
                    char c = (char)keyEvent->key();
                    if ( c == StartSign && !Catching )
                    {
                        Catching = true;
                        Text = QString( QChar( c ) );
                        Catched = true;
                    }
                    else if ( Catching )
                    {
                        Text += QString( QChar( c ) );
                        if ( c == EndSign )
                        {
                            emit sigCatchingFinished( Text );
                            Catching = false;
                            Text = "";
                        }
                        Catched = true;
                    }
                }
            }
            if ( Catched )
                return true;
            else
                return QObject::eventFilter( obj, event );
        }
    
    private:
        char StartSign, EndSign;
        bool Catching;
        QString Text;
    };
    

  • Mod

    Alternativer Ansatzpunkt wäre, die ungewollte eigenschaft des Scanners auszunutzen:

    Schreibe eine Anwendung, welche als Server funktioniert, und die dem Scanner eben genau diese Komponente mit Focus gibt, der rest ist dann nur einfach ein Message Protokoll welches dies austauscht über Sockets oder andere Wege.

    Evtl. gibt es auch eine API und C/C++ Libraries mit denen du aktiv auf den Scanner zugreifen kannst. Deinen Hack solltest du gut dokumentieren...


Anmelden zum Antworten