Partage
  • Partager sur Facebook
  • Partager sur Twitter

Action repetée sur l'appui d'une touche du clavier

    8 novembre 2018 à 20:41:08

    Bonjour à tous,

    Je m'initie à Qt après avoir lue 2 fois les cours de ce site . A la base je viens du C et du monde des microcontrôleurs.

    Ce langage pour le moins pas très intuitifs au départ . J’espère que cela viens en  s’exerçant car c'est très intéressant.

    Venant du C la langage n'est pas du tout la même que la POO.

    Je rentre dans le vif du sujet.

    Je souhaite détectée l'appui sur une touche disons le "Z" pour envoyer un message sur le port série pour faire avancer un robot .

    Voila ou je bloque, je souhaiterais faire une action lors de l'appui sur une touche et répétée cette action tant que la touche est enfoncée.

    Quand la touche n'est plus enfoncée faire une autre action .

    Touche "Z" enfoncée : envoie d'un ordre par le port série. par boucle toute les 100ms afin de faire avancer le robot(avec la fonction repeat).

    Touche "Z" relâchée, envoie d'un ordre pour arrêter les moteurs.

    Le problème c'est que la méthode KeyPressEvent, fais un repeat des autres méthodes de keyreleaseEvent

    Avez vous une solution pour parer à ce probléme ?

    Voici mon code qui me permet seulement de faire des tests pour le moment, histoire de mettre au point le comportement parfait .

    Ce code affiche donc alternativement GO et STOP quanbd je laisse la touche "Z" enfoncée.

    Alors que je souhaiterais que des "GO" et des que je la relâche un "STOP" .

    /**************************************************************************
                        méthodes
    **************************************************************************/
    
    void MainWindow::keyPressEvent(QKeyEvent *ev)
    {
    
        if (ev->key() == Qt::Key_Z)
        {
            qDebug()<<"GO";
        }
    }
    
    void MainWindow::keyReleaseEvent(QKeyEvent *)
    {
        qDebug()<<"STOP";
    }

    Je précise que cela ne fait que 3 jours que je suis sur Qt ! Ne criez pas trop fort !

     Merci à vous


    -
    Edité par dje8269 8 novembre 2018 à 20:43:08

    • Partager sur Facebook
    • Partager sur Twitter
      9 novembre 2018 à 11:41:30

      Je pense que votre problème n'est pas lié à votre manque de connaissance en C++, mais de votre mode de penser un programme comme si vous étiez toujours sur un µ-controleur.

      Votre plateforme d'exécution, ici, est radicalement différente de celle d'un µ-controleur.

      Ce qui change particulièrement la donne et la présence d'un système d'exploitation qui virtualise le matériel et rend la programmation bien plus simple.

      Ici, en pensant toujours comme si vous étiez sur un µ-controleur, vous ramez contre le courant, en essayant de contourner les services offerts par l'OS plutôt que de vous en servir.

      L'OS gère lui-même la politique de répétition des touches quand un utilisateur laisse son doigt appuyé sur une touche (répétition de touche, activation du mode "sticky-key", "magnification", etc...).

      Votre application doit vivre en bonne intelligence avec les autres applications sur la machine, qui, elles, ont besoin de ce type de gestion des touches du clavier.

      Si vous voulez toujours avoir les coudés franches et penser comme si vous étiez sur un µ-controleur, le plus simple, c'est de s'intégrer directement dans l'OS, via le développement ou l'adaptation d'un driver de clavier qui court-circuite le traitement standard du Kernel. Mais c'est largement plus "technique" que l'utilisation de quelques fenêtres via Qt et le pont entre votre application et le driver n'est pas aussi simple que l'utilisation de quelques fonctions de callback, loin s'en faut.

      Votre besoin est assez commun pour les jeux, c'est pour cela que des API spécifiques aux jeux, comme DirectX sous Windows, permettent de répondre à votre besoin.

      Je ne connais pas Qt, je ne sais pas si ce Framework dispose d'une API compatible avec ce type d'API. Si ce n'est pas le cas, vous devrez vous rabattre sur l'utilisation directe de ces API, en y sacrifiant la portabilité et en faisant attention à d'éventuels problèmes de compatibilité entre ces API de jeux et le Framework Qt.

      Il existe aussi d'autres API plus spécifique au clavier, mais rien de portable, et le fait d'avoir plusieurs applications utilisant le clavier en même temps (pas comme sous un µ-controleur) rend leur usage assez complexe.

      Après, je ne comprends pas trop votre ergonomie utilisateur dans un contexte multi-applicatif, multi-fenêtre, etc...

      Edit :

      Peut-être suffisant :

      http://doc.qt.io/qt-5/qkeyevent.html#isAutoRepeat

      -
      Edité par bacelar 9 novembre 2018 à 11:45:00

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

      Action repetée sur l'appui d'une touche du 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