Partage
  • Partager sur Facebook
  • Partager sur Twitter

[QT] Evenements clavier

Gestion du maintient d'une touche enfoncée

    19 novembre 2017 à 10:52:08

    Bonjour, je suis actuellement en train de réaliser une interface de commande d'un petit robot, j'envoie mes instructions en série à un arduino qui s'occupe de commander les moteurs via un controller. 

    Afin que cela soit naturel pour l'utilisateur, je souhaite que les instructions soient envoyées par l'appuie sur les flèches du clavier. Pour avancer, la touche flèche du haut sera donc maintenue enfoncée. 

    Il faut donc que :

    - Lorsque j'appuie sur une touche, ma fonction d'envoi soit appelée (OK)

    - Lorsque je maintiens cette touche enfoncée, rien ne se passe

    - Lorsque je relâche cette touche, ma fonction soit appelée (OK)

    Vous avez surement compris ou se situe mon problème...

    J'ai utilisé deux solutions pour parvenir a mes fins mais qui n'ont pas été concluantes : 

    1ère solution : 

    J'ai crée un Pushbutton dont le signal pressed appelait ma fonction d'envoi en slot.

    connect(AVANCERbutton, &QPushButton::pressed, this, &Dialog::sendRequestA);
    connect(AVANCERbutton, &QPushButton::released, this, &Dialog::sendRequestS);

    J'ai associé à ce bouton un shortcut de la touche Key_Up.

    AVANCERbutton->setShortcut(Qt::Key_Up);

    Visiblement, et malheureusement pour moi, shortcut voit le maintient d'une touche enfoncée comme une suite de clicked... 

    Donc en maintenant ma touche enfoncée, j'envoyais une suite rapide de "avance", "stop", vous vous en doutez le moteur n'apprécie pas trop.

    2ème solution : 

    En cherchant un peu plus, j'ai vu que l'on pouvait apparement utiliser les QKeyEvent.

    J'ai donc créer ces méthodes : 

    protected :
        virtual void keyPressEvent(QKeyEvent* event);
        virtual void keyReleaseEvent(QKeyEvent* event);
    void Dialog::keyPressEvent(QKeyEvent *event)
        {
        if(event->key() == Qt::Key_Up)
            {
            setserialport();
            serialenvoi("A");
            }
        }
    
    void Dialog::keyReleaseEvent(QKeyEvent *event)
        {
        if(event->key() == Qt::Key_Up)
            {
            setserialport();
            serialenvoi("S");
            }
        }
    

    A ma grande surprise, je croyais avoir trouvé la solution lorsque, n'ayant ajouté que keyPressEvent, le maintient de la touche n'envoyait qu'une commande. Mais lorsque j'ai ajouté le keyReleaseEvent, la même scene qu'avec le shortcut s'est produite...

    Voila vous savez tout ! 

    Donc si quelqu'un sait comment il est possible de ne prendre en compte que le premier appui d'une touche ainsi que son relâchement, je suis preneur...

    Merci d'avoir pris le temps de lire ce post et bonne journée à vous :) 

    • Partager sur Facebook
    • Partager sur Twitter
      26 novembre 2017 à 12:53:31

      Up ? :s

      Pour l'instant pour palier mon problème j'ai ajouter la prise en compte d'une manette dont les boutons appellent mes slot d'envoi de données mais bon ca ne fonctionne toujours pas au clavier ^^ 

      • Partager sur Facebook
      • Partager sur Twitter
        26 novembre 2017 à 14:56:15

        Lu',

        Plutôt que d'envoyer une commande lors du relâchement de la touche, tu peux considérer que par défaut, si le robot n'avance pas ou ne recule pas, il est à l'arrêt. Donc plus besoin de la commande "S".

        • Partager sur Facebook
        • Partager sur Twitter

        Eug

          27 novembre 2017 à 20:41:33

          Bonjour et merci pour ta réponse ! :D 

          Eh bien en fait je trouvais ça plus léger... Car du coup avec ta méthode je dois sans cesse dire envoyer a la carte que je veux qu'il avance. Or la je n'ai qu'a lui envoyer une fois... Je trouvais ca plus pratique car ce ne sont pas les seuls données qui doivent transiter et j'ai déjà essayé d'envoyer des commandes avec un débit plus rapide ca n'a pas bien fonctionné... 

          Puis je me dis qu'il doit bien y avoir une solution pour modifier ce shortcut tout de même !!! 

          Merci tout de même d'avoir pris le temps de répondre :) Bonne soirée! 

          • Partager sur Facebook
          • Partager sur Twitter

          [QT] Evenements clavier

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown