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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 39
    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 : 39
    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.

+ 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