2015-07-24 16 views
7

Ich habe eine app (nicht auf ein Spiel, wo die W/A/S/D-Taste eines besondere Bedeutung für die Navigation haben kann), wo es ein QFrame . Ich habe die keyPressEvent() überschreiben, um den Text zu bekommen, der durch Tastatur eingegeben wird, während ich mich auf das QFrame konzentriere. Dies ist mein Code:Qt keyPressEvent Registrierung nicht, wenn W/A/S/D-Taste gedrückt wird

void MyFrame::keyPressEvent(QKeyEvent *event) 
{ 
    qDebug() << "At least came here" << endl; 
    QString text = event->text(); 
    qDebug() << "Text: " << text << endl; 
} 

Wenn ich Zeichen von der Tastatur einer nach dem anderen geben, für alle Zeichen und Zahlen, sind beide Aussagen richtig protokolliert. Aber für diese vier Schlüssel wird keine der Protokollanweisungen ausgeführt, d. H. Der Ereignishandler feuert nicht einmal. Was ist falsch?

Edit: Nachdem ich die Beispiele durchgegangen bin, habe ich versucht, ein minimales funktionierendes Beispiel für meinen Bug zu erstellen. Das ist, was ich habe. Das selbe Problem auch hier mit Ereignisfilter. Nur für diese vier Zeichen wird es nicht protokolliert.

bool MyWidget::eventFilter(QObject *obj, QEvent *event) 
{ 

    if (event->type() == QEvent::KeyPress) 
    { 
     //this never gets printed 
     qDebug() << "Phew!" << endl; 
     return true; 

    } 
    if (qobject_cast<ChildWidget *>(obj) != nullptr) 
    { 


     ChildWidget *option = qobject_cast<ChildWidget *>(obj); 
     if (event->type() == QEvent::Enter || event->type() == QEvent::MouseMove) 
     { 
      //do stuff 
      return true; 
     } 
     if (event->type() == QEvent::Leave) 
     { 
      //do stuff 
      return true; 
     } 
     return QWidget::eventFilter(obj, event); 
    } 
    else 
    { 
     // pass the event on to the parent class 
     return QWidget::eventFilter(obj, event); 
    } 
} 

MyWidget::MyWidget() 
{ 
    //do other initialization 
    this->installEventFilter(this); 
} 

void MyWidget::keyPressEvent(QKeyEvent *event) 
{ 
    qDebug("At least came here"); 
    QString text = event->text(); 
    //this prints out whenever I type any character, excpet W/A/S/D 
    qDebug() << text; 
} 
+3

Haben Sie überprüft, dass dieses Ereignis nicht an anderer Stelle verarbeitet wird? Wie ein Eltern-Widget mit MyFrame, das den Prozess vorwegnimmt? –

+0

Nein, es gibt keinen solchen Fall. – SexyBeast

+1

Gibt es vielleicht einen globalen Hotkey in einer anderen App definiert? Ich hatte einen ähnlichen Fall, als foobar Hotkeys abgefangen meine – Zeks

Antwort

2

nicht sicher, ob ich etwas Missverständnis, aber der folgende Code funktioniert gut und ich sehe alle Schlüssel im Protokoll (aktiviert selbst), mit Ausnahme der Taste „w“.

Hier haben Sie:

Edit # 1: einen Ereignisfilter auf dem QApplication installiert, um die Objekte zu erhalten, die die Ereignisse filtern.

myframe.pro

TEMPLATE = app 

QT  += widgets 
SOURCES += main.cpp \ 
      myframe.cpp 

HEADERS += myframe.h 

main.cpp

#include <QtWidgets/QApplication> 
#include <QDebug> 

#include "myframe.h" 

class QApplicationFilter: public QObject 
{ 
    public: 
     QApplicationFilter(): QObject() {}; 
     ~QApplicationFilter() {}; 

     bool eventFilter(QObject* obj, QEvent* event) 
     { 
      qDebug() << "QApplicationFilter: " 
        << obj->objectName() 
        << " - event type: " 
        << event->type(); 
      return QObject::eventFilter(obj, event);    
     }; 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv);  
    a.installEventFilter(new QApplicationFilter()); 

    MyFrame mf; 
    mf.show(); 
    return a.exec(); 
} 

myframe.h

#ifndef MYFRAME_H 
#define MYFRAME_H 

#include <QtWidgets/QFrame> 

class MyFrame : public QFrame 
{ 
    Q_OBJECT 

public: 
    MyFrame(); 
    bool eventFilter(QObject *object, QEvent *event); 

protected: 
    void keyPressEvent(QKeyEvent *event); 
}; 

#endif 

myframe.cpp

#include <QDebug> 
#include <QKeyEvent> 
#include "myframe.h" 

MyFrame::MyFrame() 
{ 
    this->installEventFilter(this); 
} 

bool MyFrame::eventFilter(QObject *object, QEvent *event) 
{ 
    if (object == this && event->type() == QEvent::KeyPress) { 
     QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); 
     if (keyEvent->key() == Qt::Key_W) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
    return false; 
} 

void MyFrame::keyPressEvent(QKeyEvent *event) 
{ 
    qDebug("At least came here"); 
    QString text = event->text(); 
    qDebug() << text; 
} 
+0

Yup, es funktioniert überall, aber nicht in meiner App. Ich überprüfte gründlich (obwohl es nicht gründlich genug scheint), nirgendwo werden wir jegliche Eingabe mit diesen 4 Zeichen deaktivieren. – SexyBeast

+0

Der einzige Weg, wie ich Ereignisse abfangen kann, ist 'bool QObject :: eventFilter (QObject * überwacht, QEvent * event)'. Ich habe den Code aktualisiert, sodass die Anwendung den Schlüssel "w" nicht mehr verarbeitet. Ist in Ihrer Anwendung ein Ereignisfilter installiert? – Tarod

+0

Danke. Bitte sehen Sie edit .. – SexyBeast

4

QFrame Klasse wird als einfaches Rahmenobjekt ausgelegt. Es funktioniert standardmäßig nicht mit einer Eingabe. Daher müssen Sie explizit eine Fokusrichtlinie angeben, die es ermöglicht, Tastatureingabeereignisse mithilfe der Methode QWidget::setFocusPolicy() abzurufen. QFrame hat standardmäßig Richtlinie. Versuchen Sie, die focus policy-Eigenschaft des Frames auf Qt::StrongFocus zu setzen und starten Sie Ihr Programm erneut.

+0

Es funktioniert für alle Schlüssel außer diesen vier, also denke ich, Fokuspolitik ist nicht das Problem. Aber ich habe überprüft, nirgendwo werden wir etwas deaktivieren, um diese vier Schlüssel nicht zu akzeptieren. – SexyBeast

+0

In meiner Antwort habe ich einen 'QFrame' verwendet, ich habe seine' Fokus-Richtlinie' nicht gesetzt und die Tastatureingabeereignisse empfangen. – Tarod

+0

@Tarod das ist wegen Ereignisfilter. Es empfängt sowieso Ereignis. Und meine Antwort ergänzt das Fragebeispiel, bei dem 'keyPressEvent' überschrieben wird. –

1

Als erstes bitte tun, was Meefte sagte (Geben Sie ein Minimal, Complete, und prüfbare Beispiel "). Und schau dir deine laufenden Programme an. Hast du schon mal überprüft, dass etwas das blockiert? Versuchen Sie Ihren Code auf einem anderen Computer oder deaktivieren Sie alle Tools, die Sie für Ihre Tastatur installiert haben. Ich denke, etwas anderes blockiert deine Eingabe. Mit freundlichen Grüßen

2

Ich finde die Tatsache, dass die Schlüssel W, A, S und D typische Spiel-Bewegung Schlüssel und auch die Schlüssel, mit denen Sie Probleme mit einem sehr verdächtigen Zufall haben. Meine beste Vermutung ist, dass Sie eine Art "Gaming" -Tastatur, Systemerweiterung oder einen benutzerdefinierten Treiber haben. Ich denke an Dinge wie einen "virtuellen Joystick", "Power-Keys", VR-Software, Makro-Software usw. Ich würde mehr Vertrauen in diese Antwort haben, wenn sie nicht sowohl auf einem Mac als auch auf einem PC passiert Sie verwenden die gleiche Tastatur oder andere Hardware). So oder so würde ich eine andere Tastatur versuchen und das System im abgesicherten Modus mit anderen geschlossenen Programmen starten, nur um sicherzustellen, dass diese Schlüsselereignisse nicht auf Systemebene abgefangen/modifiziert werden.

+0

Ja, ich vermutete das gleiche, als ich herausfand, dass nur diese vier Tasten nicht funktionieren. Ich habe jedoch in einer Reihe von Systemen versucht - Windows und Mac, alle mit dem gleichen Problem .. :( – SexyBeast

+0

Waren sie alle Ihre Systeme? Vielleicht installieren Sie ein gemeinsames Programm/Treiber auf allen von ihnen? – SpliFF

+0

Nein, habe ich versucht Mein Mac und ein anderer Mac. Dann habe ich es in 2 oder 3 Windows-Laptops versucht. Das gleiche Problem überall ... :( – SexyBeast