IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Qt Discussion :

Qt, evenements clavier simultanés


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 51
    Points : 26
    Points
    26
    Par défaut Qt, evenements clavier simultanés
    Bonjour,

    J'ai bien fouillé dans la doc, apparement ça ne semble pas être géré par Qt, ou bien je ne cherchais pas dans la bonne direction.

    Le soucis : j'aimerais pouvoir déclencher une action sur l'appui de deux touches simultanément. Exemple :
    Si j'appui sur la touche bas, et la touche gauche, j'aimerais pouvoir définir une action autre qu'un simple appui sur bas ou un simple appui sur gauche. J'ai pas mal travaillé avec Swing/Awt en java, il existait les MASK qui permettaient ceci, avec Qt je ne trouve pas d'équivalent.

    Voici un exemple du code :
    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
     
    void BattleField::keyPressEvent(QKeyEvent *event)
    {
     
        if(event->key() == Qt::Key_Down && event->key() == Qt::Key_Left)//Ce que j'aimerais pourvoir écrire !
             //todo:
        else if(event->key() == Qt::Key_Down && event->key() == Qt::Key_Right)
            movePlane(BOTTOM_RIGHT);
        else if(event->key() == Qt::Key_Up && Qt::Key_Left)
            movePlane(TOP_LEFT);
        else if(event->key() == Qt::Key_Up && Qt::Key_Right)
            movePlane(TOP_RIGHT);*/
        else if(event->key() == Qt::Key_Left)
            emit moveAsked(LEFT);
        else if(event->key() == Qt::Key_Right)
            emit moveAsked(RIGHT);
        else if(event->key() == Qt::Key_Up)
            emit moveAsked(UP);
        else if(event->key() == Qt::Key_Down)
            emit moveAsked(DOWN);
    }
    Les variables passées en parametre sont des constantes que j'ai définis, le code présenté étant assez simpliste le commenter n'apporterait guère plus. Donc en gros là les 4 premieres conditions ne fonctionnent pas évidemment, et j'aimerais savoir comment faire l'équivalent que ce qu'elles sous entendent ( pas facil à exprimer héhé ).

    Voili voila, j'offre 10 lignes de code supplémentaire à celui qui me dépanne ! ( je plaisantes :p ).

    Askerat.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Salut,

    En m'appuyant sur des exemples, j'avais réussi à faire quelque chose du genre.

    monAction = new QAction(...);
    monAction->setShorcut(tr("Ctrl+X"));

    et il me semble que ça marchait.

    G.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 51
    Points : 26
    Points
    26
    Par défaut
    Et comment tu l'utilisais apres dans une methode ? Tu pourrais me donner un exemple ? Car en fait, ( ça doit pas être un secret ) j'essaye de réaliser un mini jeu un peu dans le prolongement du tutoriel proposé par trolltech sur le site officiel.

    Cependant le jeu s'appui sur le fait qu'on puisse utiliser plusieurs touches à la fois, donc je suis bloqué avant meme d'avoir réellement commencé ( J'ai déjà pratiqué les GUI, et plutot bien compris le tutoriel officiel ).

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Je ne sait pas trop si il y as une autre methode, mais tu pourrais essayé d'utiliser un tableau de bool correspondant au touche que tu veut
    tu met à true lors d'un void keyPressEvent ( QKeyEvent * event );
    tu met à false lors d'un void keyReleaseEvent ( QKeyEvent * event );

    Avec, tu pourrais utiliser un timer pour lire l'état de ton tableau à temps régulier

  5. #5
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    J'ai eu le même problème que toi à un moment. Du coup j'ai regardé dans l'exemple du jeu en OpenGL dans la doc (quelle est bien cette doc!)

    L'exemple marchait comme ça:

    dans keysPressEvent():
    if(event->key() == Qt::Key_Down)
    toucheBas = true
    move()

    et dans keyReleaseEvent():
    if(event->key() == Qt::Key_Down)
    toucheBas = false
    move()


    et en fait il y a une fonction move qui est appellé et qui fait bouger le tout selon l'état des variables toucheBas toucheGauche...

    Edit: ah ben voilà c'est exactement ce que MonGaulois a dit!

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Personnellement, c'était pour ajouter des actions aux éléments d'un menu.

    1) Je créais mon action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        newTableAct = new QAction(QIcon(":/icones/newTab.png"), tr("&Tableau"), this);
        newTableAct->setShortcut(tr("Z+T")); // voir fin du post
        newTableAct->setStatusTip(tr("Creer un nouveau tableau"));
        connect(newTableAct, SIGNAL(triggered()), this, SLOT(newTable()));
    Je la connecte à un Slot.
    Puis j'associais l'action à l'élément de mon menu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    subFileMenu->addAction(newTableAct);
    Quand je cliques sur l'élément de mon menu, ça marche, et quand je fais la combinaison( ici Z+T), ça fonctionne également.

    Par contre, si tu n'ajoutes pas l'action au menu, le raccourci ne marche plus. J espere que ca pourra t'aider.

    G.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 51
    Points : 26
    Points
    26
    Par défaut
    Un grand merci à vous vraiment, je viens de rentrer du boulot, et j'ai essayé tout ça, j'ai préféré commencer par tester la solution avec le tableau de bool, de plus j'avais déjà defini mes constantes LEFT RIGHT etc, donc il a été facil d'adapter vers quelque chose de lisible sans faire trop de modifications.

    Merci encore et bonne soirée à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Evenements clavier et souris simultanément
    Par Peps0u dans le forum Langage
    Réponses: 6
    Dernier message: 07/12/2010, 13h32
  2. [c#] Evenements clavier sur listview
    Par mikyfpc dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/11/2005, 12h35
  3. Evenement clavier sur toute l'interface
    Par Guybrush dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 08/02/2005, 12h13
  4. Problème evenement clavier sous fire fox.
    Par fxp17 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/01/2005, 15h59
  5. Ecouter les evenements clavier et souris
    Par init dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 24/11/2004, 20h02

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