Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Futur Membre du Club
    Inscrit en
    juillet 2005
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : juillet 2005
    Messages : 28
    Points : 9
    Points
    9

    Par défaut Détecter un appui et un relâchement sur l'appui d'une touche clavier

    Bonjour à tous,

    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 mon 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.
    Mais quand la touche n'est plus enfoncée( mais qu'elle l'a été) 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 par exemple . Totu comme "pushbutton"

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

    Dans un ancien post ( LIEN ) j'avais trouvé une solution de contournement pour al fonction "pushbutton" avec " isDown". Mais avec les touches du clavier nous n'avons pas cette option de disponible.

    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" .


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /**************************************************************************
                        méthodes
    **************************************************************************/
     
    void MainWindow::keyPressEvent(QKeyEvent *ev)
    {
     
        if (ev->key() == Qt::Key_Z)
        {
            qDebug()<<"GO";
        }
    }
     
    void MainWindow::keyReleaseEvent(QKeyEvent *)
    {
        qDebug()<<"STOP";
    }

    Sinon j'avais pensé a faire imiter l'appui sur un bouton quand on appui sur une touche ? mais je sais pas si ca existe ? Du genre j’appuie sur "Z" et ca enfonce le bouton ainsi je pourrais me servir de la routine du bouton plutôt que celui de la touche ?

    Merci à vous

  2. #2
    Futur Membre du Club
    Inscrit en
    juillet 2005
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : juillet 2005
    Messages : 28
    Points : 9
    Points
    9

    Par défaut

    Re moi,

    J'ai cru tenir une solution mais finalement elle est pas optimal. Je la partage quand même, cela pourra éventuellement vous aidez à m'aider ( ou pas) .

    Mon idée était d'utiliser l'attribut "isAutoRepeat" qui permet de savoir si l'action vient de premier événement ou d'une répétition de l’événement.
    Donc en gros donc la méthode released .

    Si c'est du à une répétition d’événement ( quand la touche est enfoncée) alors je ne fais rien, car l'action est causé par le repeat et non car on a lâché la touche.
    Par contre si le relâchement est du au premier relâchement et donc pas par un repeat , c'est que la touche à été relâcher donc j'effectue une tâche.

    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    /**************************************************************************
                        méthodes
    **************************************************************************/
     
    void MainWindow::keyPressEvent(QKeyEvent *ev)
    {
     
            if (ev->key() == Qt::Key_Z)
             {
                serial.write(trame_Av);  // J'envoie la trame au port serie
                qDebug()<<"Go";
                //(new QTimer())->start(500);
             }
    }
     
    void MainWindow::keyReleaseEvent(QKeyEvent *ev)
    {
        if(ev->isAutoRepeat())
        {
            return;
        }
        else
        {
            serial.write(trame_St); // J'envoie la trame au port serie
            qDebug()<<"Stop";
        }
    }
    Dans les faits ce fonctionne ! Ce qui est une bonne chose .
    Oui mais voila .
    1/ Je n'arrive pas a modifier le temps de l'autorepeat ?
    2/ Alors de l'appui sur une touche clavier, il se passe un petit laps de temps, entre le premier appui, et les répétitions. Ce qui est gênant pour piloter un robot roulant. Car en fait les moteurs reçoivent une impulsion, puis s’arrête brièvement et reparte ce coup ci sans interruption.

    Je ne sais pas si le 2/ ou pourra l'éviter ! par contre pour le 1/ je pensais peut etre mettre un Qtimer pour effectuer une pause ? mais sa fonctionne pas. Je suppose que le repeat n'en tiens pas compte . il faudrait que j'essaye en gérant la répétition moi même ?

    Avez vous des idées a me proposer pour arriver à mes fins ! et que mon fils puisse enfin faire avancer ce robot avec le clavier ou la souris ! sinon je vous l'envoie mon fils ça vous apprendra !

  3. #3
    Futur Membre du Club
    Inscrit en
    juillet 2005
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : juillet 2005
    Messages : 28
    Points : 9
    Points
    9

    Par défaut

    Bonjour ,

    J'ai pensé à une autre solution, qui me semblait parfaite. Étant donné que les boutons fonctionnent parfaitement quand je clic dessus avec la souris !
    Je pensais mettre des raccourcis sur ces boutons. Donc en gros quand j’appuie sur une touche du clavier cela "simule" le click avec la souris . Oui mais voila ça ne fonctionne pas tout a fais comme je l’espérait et je ne sais pas trop pourquoi.

    Peut-être avez une explication ?

    Voici la partie du code testé . Je n'ai effectué que sur un seul bouton. J'ai donc mis un raccourci sur le bouton avec la touche "Up" grâce à Qt designer. La fonction autorepeat est activée sur ce bouton.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    /**************************************************************************
       Cette fonction envoi la trame pour AVANCER quand on clic sur le Bouton
       Le Bouton est configuré en auto-repaeat avec delay 100ms
    **************************************************************************/
    void MainWindow::on_Bouton_Av_pressed()
    {
      if( ui->Bouton_Av->isDown() )
        {
          serial.write(trame_Av);  // J'envoie la trame au port serie
          qDebug()<<"Go";
        }
        else
        {
            serial.write(trame_St); // J'envoie la trame au port serie
            qDebug()<<"Stop";
        }
    };
     
    //   Cette fonction envoi la trame pour ARRETER quand on relache le Bouton
    void MainWindow::on_Bouton_Av_released()
    {
        if( !ui->Bouton_Av->isDown() )
          {
            serial.write(trame_St);  // J'envoie la trame au port serie
            qDebug()<<"Stop";
          }
        else
         {
          serial.write(trame_Av);  // J'envoie la trame au port serie
          qDebug()<<"Go";
         }
    }
    Ca fonctionne PRESQUE bien, mais tout les 5 envois et il y a un STOP qui part et je ne vois pas pourquoi !
    Voila le résultat dans la console quand je laisse le doigt appuyé sur "Up" la flèche du Haut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Go
    Stop
    Go
    Go
    Go
    Go
    Go
    Stop
    Go
    Go
    Go
    Go
    Go
    Stop

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/06/2018, 11h21
  2. Envoyer une touche clavier sans focus sur fenetre
    Par linked dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 21/04/2009, 21h33
  3. Réponses: 11
    Dernier message: 30/09/2008, 21h52
  4. envoyer la saisie après l'appui sur une touche clavier
    Par Jahjouh dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/06/2008, 11h20
  5. detecter le double "appuie" d'une touche clavier
    Par jadey dans le forum Flash
    Réponses: 4
    Dernier message: 25/03/2007, 03h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo