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 jambi et les event?


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut Qt jambi et les event?
    bonjour

    Je développe une interface en QT avec QT JAmbi. Je viens de trouver comment faire pour rendre une image d'un QLABEL cliquable (redéfinition de QLabel avec ajout d'une fonction public void mouseReleaseEvent (QMouseEvent event){...}
    Cependant, en lisant les doc, je me suis rendu compte d'un event.accepted(). Voila en C++ ce que ca donne :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MonQLabelClickable : public QLabel
    {
    Q_OBJECT;
    public slots:
    void mouseReleaseEvent ( QMouseEvent * event )
    {
    emit(clicked());
     event->accept();
    }

    j'ai lu toute sorte de doc sur les évenements (http://qt.developpez.com/doc/4.4/qwi...sereleaseevent, http://qt.developpez.com/doc/4.2/eventsandfilters/...) mais je ne comprend pas vraiment l'essence même de ce event.accepted(). En java, voici ce que j'ai développé :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class MyQLabel extends QLabel {
     
    	public MyQLabel() {
    		super();
    	}
     
    	public void mouseReleaseEvent (QMouseEvent event)
    	{
    		if(event.button()==MouseButton.LeftButton){
    			System.out.println("Cliked");
    			event.accept();
    		}
    	}
    Bref, je redéfinis mon MyQLabel pour qu'il puisse accepter les mouseEvent. Si j'ai bien compris, au release du click sur mon image (mylabel), j'ai cette fonction que est appelé, et j'ai l'event "event" de type QMouseEvent de créé. Le but n'est il pas de délivrer cet event a un autre objet pour interagir? Si oui, ça doit passer par un event.accepted() (il me semble). Mais comment un autre objet peut récupérer l'appel de l'event (genre comment ma fenêtre sait qu'elle doit se fermer par exemple)? Si il n'y a pas de code de bonne conduite, on pourrait à ce moment mettre l'événement entre les parenthèses du if ci dessus. Ca fonctionne, mais ça oblige a créer une autre classe MyLabel2 si on veut qu'un autre label fasse une action différente {alors que sinon on a juste a redéfinir l'event recu non?}. Est ce la bonne conduite ?

    Merci a tous

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Salut.
    Je pense que c'est pareil qu'en C++.
    En gros, les class Qt sont ordonnées suivant un arbre.
    Les event va du parent vers les enfants.
    Si un event passe accepted au cour de ce trajet, il ne sera pas transmis aux enfants restant.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par flavio_dev
    Cependant, je n'ai pas tout bien compris ou tu voulais en venir... admettons que mon parent, c'est mon image. L'objectif de ce click d'image, c'est de modifier un label texte par exemple (ce label est donc son enfant?!). Comment m'y prendre? Je passe le label en public static pour qu'il soit accessible (ce que j'ai fais pour le moment...)? Je ne dois pas faire un truc avec "event" pour que ce label comprenne qu'il doit changer?

    Précision: je n'ai jamais fait de C++... il y a quelques différences entre les classes entre JAMBI et QTC++... donc je suis un peu largué!

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    en gros tu as une ihm comme cela :

    ...........Dialog
    ..............|
    |--------------|
    Button..........Label

    Dialog est parent de Button et de Label.

    En gros, lors qu'un événement est généré il va passer du parent aux enfants :
    click souris sur le label :
    Dialog reçois cette événement. Comme il ne l'accepte pas il le passe à l'enfant qui est surement concerné en f(position souris).

    Si tu veut que dialog ne transmette pas l'event au label, dialog doit accepter l'event.

    C'est en gros ce qui se passe.

  5. #5
    Membre émérite

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

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

    J'ai du mal à cerner ton problème. le "event" en paramètre de ton mouseReleasedEvent() contient juste des informations sur le type d'évenement : ici ce sera par exemple le bouton qui est relaché (droite ou gauche) et ses coordonées.

    La méthode accept() ou accepted() avec Jambi permettent de "capter" l'évènement, c'est à dire limiter sa propagation dans les parents de ta classe actuelle. Ca ressemble un peu aux try/catch des exceptions Java. Si une exception est levée dans un bloc, et qu'elle n'est pas captée, elle sera retransmise dans le bloc de niveau supérieur, et cela jusqu'à ce qu'elle soit traitée.

    C'est du même genre pour les event, sauf qu'on parle bien de propagation dans les parents successifs. On entend par parents les widgets "conteneurs" du widget actuel. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QWidget *a = new QWidget();
    QWidget *b = new QWidget(a); // a est le parent de b
    QLabel *c = new QWidget(b); // b est le parent de c, et a est toujours le parent de b
    Ainsi si dans ton label "c" un event est crée, et qu'il n'est pas "accepted", alors le QWidget b va aussi le gérer avec son mouseReleasedEvent() , et s'il ne l'accepte pas, a va faire de même.

    En éspérant avoir éclairci la situation.

    G.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par Gulish Voir le message
    Ainsi si dans ton label "c" un event est crée, et qu'il n'est pas "accepted", alors le QWidget b va aussi le gérer avec son mouseReleasedEvent() , et s'il ne l'accepte pas, a va faire de même.
    tu est sur que c'est dans ce sens?

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    ha oui je ma suis planté de sens .
    Mais ca dépend du type de l'event :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    #include <QtGui>
     
    class myWidget : public QFrame
    {
        QString m_name;
     
        public :
            myWidget(QString name,QWidget * parent = 0)
            :QFrame(parent),m_name(name)
            {
                setFrameShape (QFrame::Box);
            }
        protected :
            void mousePressEvent(QMouseEvent * event)
            {
                qDebug()<<"mousePressEvent : "<<m_name;
                event->ignore ();
            }
     
            void paintEvent(QPaintEvent * event)
            {
                qDebug()<<"paint event : "<<m_name;
                QFrame::paintEvent(event);
                QPainter p(this);
     
                p.drawText(rect(),Qt::AlignCenter,m_name);
     
            }
    };
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        myWidget w("PARENT");
        w.resize(400,400);
        QGridLayout * l = new QGridLayout;
        {
            l->setSpacing(20);
            w.setLayout(l);
            l->addWidget(new myWidget("A"),0,0,1,1);
            l->addWidget(new myWidget("B"),0,1,1,1);
            l->addWidget(new myWidget("C"),1,0,1,1);
            l->addWidget(new myWidget("D"),1,1,1,1);
        }
        w.show();
        return a.exec();
    }
    un event de type paintevent va du parent vers les enfants.
    un event du type mouseclick va de l'enfant vers le parent.

    Il me semble que le point de départ est le QApplication

  8. #8
    Membre émérite

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Euh, Mongaulois, il me semble que c'est l'inverse :
    En gros, lors qu'un événement est généré il va passer du parent aux enfants :
    click souris sur le label :
    Dialog reçois cette événement. Comme il ne l'accepte pas il le passe à l'enfant qui est surement concerné en f(position souris).
    Dans la doc, on lit
    void QEvent::accept ()
    Sets the accept flag of the event object, the equivalent of calling setAccepted(true).

    Setting the accept parameter indicates that the event receiver wants the event. Unwanted events might be propagated to the parent widget.
    See also ignore().
    G.

Discussions similaires

  1. SDL - Utiliser les Events sans video.
    Par AliceD dans le forum SDL
    Réponses: 6
    Dernier message: 20/07/2006, 17h32
  2. [Forms-PJC]Les events en dehors de mon wrapper
    Par patmaba dans le forum Forms
    Réponses: 13
    Dernier message: 16/06/2006, 12h05
  3. Capturer les event de ma souris en dehors de mon appl
    Par bpy1401 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 28/07/2005, 16h59
  4. les event de IBQuery pour activer,desactiver la Transaction?
    Par amad206 dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/03/2005, 14h12
  5. Gérer les events d'un tableau de boutons
    Par lord_kalipsy dans le forum wxWidgets
    Réponses: 7
    Dernier message: 20/10/2004, 10h13

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