2015-07-24 2 views
7

J'ai une application (non liée à un jeu où les touches W/A/S/D peuvent avoir des significations spéciales pour la navigation) QFrame . J'ai dépassé le keyPressEvent() pour que le texte soit tapé au clavier tout en mettant l'accent sur ce QFrame. Ceci est mon code:Qt keyPressEvent ne pas enregistrer lorsque les touches W/A/S/D sont pressées

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

Lorsque je tape des caractères à partir du clavier un à la fois, pour tous les caractères et les nombres, les deux déclarations sont enregistrées correctement. Mais pour ces quatre clés, aucune des instructions log n'est exécutée, c'est-à-dire que le gestionnaire d'événements ne tire même pas. Qu'est-ce qui ne va pas? Edit: Après avoir parcouru les exemples, j'ai essayé de former un exemple de travail minimal de mon bogue. C'est ce que j'ai. Même problème ici avec le filtre d'événement. Seulement pour ces quatre caractères, il n'est pas connecté.

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

Avez-vous vérifié que cet événement n'est pas traité ailleurs? Comme un widget parent contenant MyFrame préemptant le processus? –

+0

Non, il n'y a pas un tel cas .. – SexyBeast

+1

Existe-t-il un raccourci global défini dans une autre application? J'ai eu un cas similaire quand les raccourcis de foobar ont intercepté le mien – Zeks

Répondre

2

Je ne sais pas si j'ai mal compris quelque chose, mais le code suivant fonctionne bien et je vois toutes les clés dans le journal (même en majuscules) sauf la touche "w".

Vous avez ici:

Edit # 1: installé un filtre d'événement sur le QApplication pour obtenir les objets qui filtrent les événements.

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

Oui, ça marche partout, mais pas dans mon application. J'ai vérifié minutieusement (bien que cela ne semble pas assez complet), nous ne désactivons aucune entrée avec ces 4 caractères. – SexyBeast

+0

La seule façon que je connaisse pour intercepter les événements est l'utilisation de 'bool QObject :: eventFilter (QObject * observé, événement QEvent *)'. J'ai mis à jour le code alors maintenant l'application ne traite pas la clé "w". Avez-vous un filtre d'événement installé dans votre application? – Tarod

+0

Merci. S'il vous plaît voir modifier .. – SexyBeast

4

QFrame La classe est conçue comme un objet cadre simple. Cela ne fonctionne pas avec n'importe quelle entrée par défaut. Vous devez donc spécifier explicitement une stratégie de focus qui permet de récupérer les événements d'entrée au clavier en utilisant la méthode QWidget::setFocusPolicy(). QFrame par défaut a Qt::NoFocus politique. Essayez de définir la propriété focus policy du cadre sur Qt::StrongFocus et relancez votre programme.

+0

Il fonctionne pour toutes les clés, sauf les quatre, donc je suppose que la politique de mise au point n'est pas le problème. Mais j'ai vérifié, nulle part nous ne désactivons quoi que ce soit pour ne pas accepter ces quatre touches. – SexyBeast

+0

Dans ma réponse j'ai utilisé un 'QFrame', je n'ai pas défini sa' politique de focus' et les événements d'entrée au clavier sont reçus. – Tarod

+0

@Tarod c'est à cause du filtre d'événement. Il reçoit l'événement de toute façon. Et ma réponse complète l'exemple de questions où 'keyPressEvent' est surchargé. –

1

En tant que premier s'il vous plaît faire ce que dit Meefte (donner un exemple minimal, complet et verifiable "). Et jetez un oeil à vos autres programmes en cours d'exécution. Avez-vous déjà vérifié que quelque chose le bloque? Essayez votre code sur un autre ordinateur ou désactivez tout outil que vous avez installé pour votre clavier. Je suppose que quelque chose d'autre bloque votre entrée. Cordialement

2

Je trouve que les touches W, A, S et D sont des touches de mouvements de jeu typiques et que les touches avec lesquelles vous rencontrez des problèmes sont une coïncidence très suspecte. Ma meilleure estimation est que vous avez une sorte de clavier "jeu", une extension système ou un pilote personnalisé. Je pense à des choses comme un «joystick virtuel», des «power keys», un logiciel de réalité virtuelle, un logiciel de macros, etc. Je serais plus confiant dans cette réponse si cela ne se produisait pas sur Mac et PC (à moins vous utilisez le même clavier ou un autre matériel). D'une manière ou d'une autre, j'essaierais un autre clavier et démarrerais le système en mode sans échec avec d'autres programmes fermés juste pour m'assurer que ces événements clés ne sont pas interceptés/modifiés au niveau du système.

+0

Oui, je m'en doutais quand j'ai découvert que seules ces quatre clés ne marchaient pas. Cependant, j'ai essayé dans un certain nombre de systèmes - Windows et Mac, tous avec le même problème .. :( – SexyBeast

+0

Ont-ils tous vos systèmes? Peut-être que vous installez un programme/pilote commun sur chacun d'eux? – SpliFF

+0

Non, j'ai essayé mon Mac et un autre Mac Puis j'ai essayé dans 2 ou 3 ordinateurs portables Windows Même problème partout .. :( – SexyBeast