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 :

Propagation des évènements vers un QGraphicsWidget [Graphics View]


Sujet :

Qt

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 10
    Par défaut Propagation des évènements vers un QGraphicsWidget
    Bonjour,

    J'ai créé pour les besoins d'un projet une classe héritant de QGraphicsView, représentant un viewer, un classe héritant de QGraphicsScene, représentant une image, une classe héritant de QGraphicsWidget représentant un prototype(ou objet générique).

    J'utilise les classes de la manière suivante, utilisation de ma classe héritant de QGraphicsView en tant que fenêtre principale, contenant ma classe héritant du QGraphicsScene, et l'ajout d'un item (instance de ma classe héritant de QGraphicsWidget).

    Je cherche à capter l'évènement mousePresseEvent au sein du Widget et curieusement celui ci est très aléatoire alors quand utilisant une classe dérivée d'un QGraphicsItem, cela fonctionne correctement.

    Quelqu'un aurait il une idée ou connaissance de mon problème voir une solution à celui ci ou alors une explication sur la propagation des évènement vers un QGraphicsWidget à travers un QGraphicsScene.

    Merci.

    Alain.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 97
    Par défaut
    J'ai aussi rencontrer ce problème. Pour le résoudre il suffit d'appeler l'event parent de ton QGraphicsView

    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void My_QGraphicsView::mousePressEvent(QMouseEvent *event)
    {
    	if(event->button() == Qt::RightButton)
    	{
    	}
    	QGraphicsView::mousePressEvent(event);
    }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 10
    Par défaut
    Je n'ai pas l'impression que cela règle le problème !!!

    voici un extrait de mon 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
    22
     
    class AlsPrototype : public QGraphicsWidget
    {
        Q_OBJECT
     
    signals:
        void sigChanged(int aState);
     
    private:
        QPolygon* mpPolygon;
        int mState;
     
    protected:
        QRectF boundingRect() const;
        void paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 );
        void mousePressEvent ( QGraphicsSceneMouseEvent * event );
     
    public:
        AlsPrototype();
        void ChangeEvent();
     
    };
    et voici la classe elle même

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    AlsPrototype::AlsPrototype()
    {
        mpPolygon = new QPolygon();
        mpPolygon->setPoints(4,0,0,100,0,100,100,0,100);
    }
     
    QRectF AlsPrototype::boundingRect() const
    {
        return QRectF(0,0,100,100);
    }
     
    void AlsPrototype::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
    {
        QColor vColor(0,0,255);
     
        painter->setRenderHint(QPainter::Antialiasing);
        QPen vPen(vColor,Qt::SolidLine);
        painter->setPen(vPen);
        QBrush vBrush(vColor,Qt::SolidPattern);
        painter->setBrush(vBrush);
     
        painter->drawPolygon(*mpPolygon);
     
        painter->save();
     
        if(mState==0)
        {
            vColor.setRgb(255,255,255,255);
     
            vPen.setColor(vColor);
            painter->setPen(vPen);
            vBrush.setColor(vColor);
            painter->setBrush(vBrush);
     
            painter->drawPolygon(*mpPolygon);
     
            painter->save();
     
        }
    }
     
    void AlsPrototype::ChangeEvent()
    {
        if(mState==0)
            mState=1;
        else
            mState=0;
     
        update();
        emit sigChanged(mState);
    }.
     
    void AlsPrototype::mousePressEvent ( QGraphicsSceneMouseEvent * event )
    {
        if(event->button() == Qt::LeftButton)
            ChangeEvent();
    }
    et malgré la redéfinition de la méthode mousePressEvent dans le QGraphicsView cela ne se propage pas vers le QGraphicsWidget.

    Donc retour à la case départ !!!

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 97
    Par défaut
    C'est sur le view qui faut le faire mais tu dois pas reimplementer le mousePress c'etait juste un exemple. Si tu reecris la methode mousePress dans ton view alors faut rappeler l'event mousePress de ton parent.

    Quels sont les méthodes que tu as reimplementer ds ton View et Scene ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 10
    Par défaut
    voilà ce que j'ai fais pour essayer de résoudre le problem :

    voici les méthode redéfinies pour le QGraphicsScene

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void AlsImage::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent )
    {
        QGraphicsScene::mousePressEvent(mouseEvent);
    }
     
    void AlsImage::mouseReleaseEvent ( QGraphicsSceneMouseEvent * mouseEvent )
    {
        QGraphicsScene::mouseReleaseEvent(mouseEvent);
    }
    et voici les méthodes redéfinies poour le QGraphicsView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void AlsViewer::mousePressEvent(QMouseEvent *event)
    {
        QGraphicsView::mousePressEvent(event);
    }
     
    void AlsViewer::mouseReleaseEvent ( QMouseEvent * event )
    {
        QGraphicsView::mouseReleaseEvent(event);
    }
    je les ai redéfinies pour voir ou s'arrété la propagation de l'event et en fait il arrive correctement dans le QGraphicsView et dans le QGraphicsScene mais il n'est pas propagé ensuite, ou du moins il l'est la première fois puis après c'est aléatoire !!!

    C'est a n'y rien comprendre !!!

    merci de ton aide XHeLL !!!

    Alain.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    Salut,

    Normalement ce n'est pas une histoire de propagation car un QGraphicsWidget dessiné dans une QGraphicsScene sera au dessus de cette scene (ainsi qu'au dessus de la QGraphicsView) donc le clic sur ce widget sera directement capté par lui même.

    Si j'ai bien compris ton QGraphicsWidget à une taille de 100 x 100, essaye d'y définir, dans le header:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    protected:
    	QSizeF sizeHint(Qt::SizeHint which, const QSizeF & constraint = QSizeF()) const;
    Dans la source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QSizeF AlsViewer::sizeHint(Qt::SizeHint which, const QSizeF & constraint/* = QSizeF()*/) const
    {
    	Q_UNUSED(which)
    	Q_UNUSED(constraint)
    	return QSizeF(100., 100.);
    }
    G.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 10
    Par défaut
    Avec ta méthode cela à l'air de fonctionner, mais peux tu me donner une explication de quelle impact cette méthode a sur le mousePressEvent ?

    Merci !!!

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 10
    Par défaut
    Ok après vérification de la méthode sizeHint(), je me suis aperçu que celle ci permettait de définir les différents type de taille (Maximum, Minimum et Preferred) et je n'avais pas appelé ces même fonctions.

    Par contre j'aimerais comprendre le rapport cause à effet sur le fait de ne pas définir ces méthode et le problème de non accessibilité du mousePressEvent() !!!

    Si quelqu'un a la réponse.

    Merci

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    De ce que je déduit de ce que j'ai vu du comportement (pour ma part ce n'était pas un problème de clic mais un rectangle qui disparaissait quand je scrollait dans ma vue) je pense que sizeHint est appelée lors d'un update, d'un clic, ... pour, suivant la valeur rendue dire par exemple "je suis toujours dans l'écran donc tu peux continuer à me dessiner" ou dans le cas du clic dans la vue "la position du clic est cx, cy, ma position est x, y et ma sizeHint est 100 100 donc je prends/je ne prends pas le clic".

    G.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Février 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 10
    Par défaut
    Citation Envoyé par gluttony Voir le message
    De ce que je déduit de ce que j'ai vu du comportement (pour ma part ce n'était pas un problème de clic mais un rectangle qui disparaissait quand je scrollait dans ma vue) je pense que sizeHint est appelée lors d'un update, d'un clic, ... pour, suivant la valeur rendue dire par exemple "je suis toujours dans l'écran donc tu peux continuer à me dessiner" ou dans le cas du clic dans la vue "la position du clic est cx, cy, ma position est x, y et ma sizeHint est 100 100 donc je prends/je ne prends pas le clic".

    G.
    Ouais c'est assez tordus comme procédé mais en tout cas en utilisant les méthode de définition des tailles, cela fonctionne, en même temps cela est surement fait pour que si tu move le widget la scene en soit informé !!!

    Bref merci en tout cas !!! ;D

    Alain.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    Je pense que dans certains cas il ne peut pas y avoir de calcul trivial de la sizeHint(), par exemple tu peux avoir un "if (blabla) then display item(100x100) else display item(20x20)".

    Et pas de quoi .

    G.

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

Discussions similaires

  1. Propagation des évènements
    Par le_chomeur dans le forum jQuery
    Réponses: 20
    Dernier message: 27/07/2011, 22h04
  2. Propagation d'évènement d'un JPanel vers son containeur JTabbedPane
    Par molokoi dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 09/04/2010, 12h20
  3. Propagation des évènements du clavier
    Par monnomamoi dans le forum GTK+
    Réponses: 6
    Dernier message: 30/01/2010, 02h48
  4. Réponses: 4
    Dernier message: 20/10/2009, 18h34
  5. Des Tables Vers un schéma
    Par azman0101 dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/05/2004, 09h24

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