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

Discussion :

La gestion des événements

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Points : 69
    Points
    69
    Par défaut La gestion des événements
    Bonjour a tous, je fais appelle a vous car je rencontre de grosse difficulté concernant la gestion des evenements.
    Je n'ai commencé qu'a travaillé dessus que depuis hier, je suis donc un grand debutant.

    J'ai chercher des tutoriels qui explique le fonctionnement de la gestion des evenements mais je n'ai rien trouver, c'est pourquoi je me tourne vers vous.

    J'ai compris le principe de la gestion des evenements mais je n'ai absolument rien compris à cette histoire de focus (j'ai juste compris que sa servait a faire en sorte qu'un widget soit le widget courant, mais je vois pas a quoi sa sert).
    J'ai egalement lu sur des forums qu'il fallait egalement utiliser les methode accpet() et ignore (la aussi je ne comprend pas pourquoi et surtout a quoi sa sert).
    J'ai lu la doc du site officiel de Qt mais je ne comprend que partiellement les explications.

    Alors pour essayer de comprendre j'ai fait un petit programme pour laquel lorsqu"on appuye sur la fleche directionnelle droite, le curseur du slider se place a la position 99.

    Voici le 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
    void UnClient::keyPressEvent(QKeyEvent* event)
    {
          horizontalSliderClient->setFocus();
     
        if (event->key() == Qt::Key_Right)
        {
     
            horizontalSliderClient->setSliderPosition(99);
            QMessageBox::information(this, "", "on appuye sur la touche -->");
     
        }
        else if (event->key() == Qt::Key_Escape)
        {
            QMessageBox::information(this, "", "on appuye sur la touche Esc");
            close();
        }
     
    }
    et comme je ne comprend rien a la gestion des evenements, forcement le code ne fonctionne pas non plus.

    J'aimerai donc que vous m'explquiez ce qu'est cette histoire de focus et de méthodes accept() et ignore() a utiliser afin que je puisse faire fonctionner cette evenement parce que je tourne en rond malgré mes recherches.

    PS : merci de votre patience et des explications que vous m'apporterez.
    PS2 : le probleme peut vous paraitre ridicule mais bon je n'y arrive pas

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Alors je ne suis peut être pas une référence sur le sujet mais je n'ai jamais entendu parler d'acpet() et focus() dans Qt.

    Je te conseille ce guide pour commencer : http://qt.developpez.com/tutoriels/introduction-qt/

    Sinon en gros Qt fonctionne avec des "signaux" et des "slots"
    lors d'actions particulières (comme un clic sur un bouton) un signal est émis
    tu peux connecter (via la fonction connect de QObject) des signaux à un ou plusieurs slots, qui sont en fait des fonction exécutées à chaque fois que le signal est émis.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Points : 69
    Points
    69
    Par défaut
    merci, je connais cette maniere de proceder, mais je souhaiterai utiliser l'autre maniere, c'est a dire, ce que j'ai exposé au dessus

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    pour setFocus t'a les explications ici:
    http://qt.developpez.com/doc/4.6/qwidget/#setFocus

    en gros ça permet au QWidget sur lequel tu appelle setFocus de gérer les evenements clavier, c'est lui seul qui les gère (si j'ai bien compris)

    Tu dois donc faire setFocus sur ton objet UnClient, en dehors de la fonction keyPressEvent

    ça devrait suffire, je vois pas ce que viens faire le accept() et ignore()

  5. #5
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu pourrais passer un lien de doc plus récent ^^ http://qt.developpez.com/doc/latest/qwidget/#setfocus

    La notion de focus est très simple à comprendre, avec les champs de texte par exemple. Si le curseur clignote dedans, c'est qu'il a le focus, on sait que quand on écrira ça tapera dedans. Si je clique sur la page à côté du champ et que j'essaye de taper, ça donnera rien car la page aura le focus et non plus le champ. Un seul élément peut prendre le focus (tu peux pas écrire réellement à deux endroits à la fois).

    Ton horizontalSliderClient->setFocus() ne sert à rien, car tu ne souhaites pas qu'il prenne le focus justement, au détriment de ton "UnClient" (à moins que tu aies une classe sliderClient où tu as implémenté un contrôle clavier quelconque).

    Concernant accept() et ignore(), la doc est assez clair il me semble, http://qt.developpez.com/doc/latest/qevent/#accept
    Ça agit juste sur la propagation aux parents.

    Exemple (un peu idiot mais c'est ce qui me vient à l'esprit :p) :
    Tu as un champ texte dans une fenetre QWidget. Tu veux qu'on puisse déplacer cette fenêtre avec les flèches quoi qu'il arrive, donc tu vas empêcher l'utilisation normale des flèches dans le champ texte (déplacement du curseur). Alors tu devras réimplémenter le keyPressEvent de QLineEdit, par exemple, pour faire des event.ignore() pour les flèches, comme ça l'événement sera récupéré par la fenêtre pour se déplacer, même si c'est ton champ qui a le focus !

    Je sais pas si c'est clair, reprenez-moi si je dis des bêtises

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Points : 69
    Points
    69
    Par défaut
    d'accord je te remercie pour tes explications tres explicite
    je comprend mieux a present.
    Toutefois j'ai encore une question : Comment faire pour faire en sorte que le QLineEdit refile les fleches au parent ? Je sais qu'il faut utiliser ignore mais etant donné que je n'ai passé acces au code de la classe QLineEdit et que donc je ne peuxdonc pas re implementer keyPressEvent(QKeyEvent* event), comment est ce que je doit m'y prendre ?

  7. #7
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Par réimplémenter (redéfinir plutôt...), je veux dire que tu fais ta propre classe héritant de QLineEdit, et les méthodes de gestion d'événements étant virtuelles tu peux les réécrire, comme tu as déjà fait avec ton UnClient héritant de QWidget ou quelque chose comme ça.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Points : 69
    Points
    69
    Par défaut
    oui je vois ce que tu veux dire, mais etant donner que j'ai utilisé QtCreator pour faire mon interface (avec les LineEdit a l'intérieur), creer ma propre LineEdit pour pouvoir re implementer keyPressEvent(QKeyEvent* event) me sera inutile car le LineEdit de l'interface sera toujours celle que j'ai placer a l'aide de QtCreator.
    La seule maniere de faire pour que je puisse faire ce que tu proposes c'est de faire mon interface en le codant entierement, sans utiliser QtCreator pour pouvoir faire un héritage avec QLineEdit et ainsi modifier le keyPressEvent(QKeyEvent* event) dans la classe fille.

    Je sais pas si tu vois ce que je veux dire (désolé j'ai du mal a m'exprimer)
    Tu n'aurais pas une autre solution.

    En tous merci encore pour avoir pris le temps de m'expliquer

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Si tu veux modifier le comportement par défaut d'un widget, il faut faire comme le dit Troudhyl, c'est à dire créer ton propre widget héritant de QLineEdit en redéfinissant les fonctions virtuelles.

    Pour QtDesigner, il faut simplement créer ta nouvelle classe puis dans QtDesigner cliquer sur ton widget et faire "Promouvoir en..." et de mettre le nom de la classe et le fichier d'en-tête contenant la définition de la classe.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Points : 69
    Points
    69
    Par défaut
    ok, merci a vous pour vos reponses, je vais essayer sa

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

Discussions similaires

  1. [XML] [EXPAT] xml_parse et la gestion des événements...
    Par Herode dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 05/02/2006, 21h59
  2. Gestion des évènements Netscape 7.0
    Par RATHQUEBER dans le forum Autres langages pour le Web
    Réponses: 6
    Dernier message: 19/12/2005, 17h26
  3. Problème avec la gestion des événements
    Par CynO dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 11h07
  4. [JTable] gestion des événements
    Par soulhouf dans le forum Composants
    Réponses: 4
    Dernier message: 19/08/2005, 14h21
  5. Gestion des évènements lors d'un clique sur une image.
    Par yoghisan dans le forum Débuter
    Réponses: 7
    Dernier message: 23/06/2005, 20h04

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