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

PyQt Python Discussion :

propagation d'event QGraphicsScene


Sujet :

PyQt Python

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2018
    Messages : 29
    Points : 64
    Points
    64
    Par défaut propagation d'event QGraphicsScene
    Bonjour,

    J'essaie de comprendre comment se propagent les event dans pyqt5

    contexte :
    ======
    Je souhaite interactivement tracer des formes (QGraphicsEllipseItem par exemple) au sein d'un QGraphicsScene,
    puis pouvoir déplacer ces formes à l'aide de la souris.
    Donc interagir avec ma scene et mon ellipse par le biais d'un event mousePressEvent propre à chacun.
    Seulement, la scene reçoit bien l'event, mais je n'arrive pas à le propager à l'object ellipse

    Piste :
    =====
    Il me semble qu'il soit possible de contrôler le mécanisme de propagation avec les fonctions accept et ignore, mais sans résultats

    Voici les deux objets:
    ==============
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    from PyQt5 import QtCore, QtGui, QtWidgets

    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
    class MyGraphicScene(QtWidgets.QGraphicsScene):
     
        def __init__(self, parent):
            super(MyGraphicScene, self).__init__()
            self.setSceneRect(0,0,600,400)
            self.clear()
     
            self.wait_for_input = False
     
        def mousePressEvent(self, e):
            e.accept()
            print('')
            print(' --- new event --- ')
            print('click on scene')
            print(f'wait for input : {self.wait_for_input}')
     
            if self.wait_for_input :
                e.accept()
                ellipse = MyEllipse(e.scenePos().x(), e.scenePos().y(), 70, 70)
                self.addItem(ellipse)
                print(ellipse)
                self.wait_for_input = False
            else:
                e.ignore()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MyEllipse(QtWidgets.QGraphicsEllipseItem):
     
        def __init__(self, x, y, w, h):
            super(MyEllipse, self).__init__(x, y, w, h)
            self.setFlags(QtWidgets.QGraphicsItem.ItemIsMovable)
     
            self.pen=QtGui.QPen(QtGui.QColor(QtCore.Qt.green))
            self.pen.setWidth(15)
            self.setPen(self.pen)
     
        def mousePressEvent(self, e):
            print('click on ellipse')
    Retour de la console lors de l’exécution :
    =========================
    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
    button clicked  # variable wait_for_input à True
    ringgraphBtn 
     
     --- new event --- # création de l'ellipse à l'endroit du clic sur la scene
    click on scene
    wait for input : True
    <previewgraphicscene.MyEllipse object at 0x7efcd25a5670>
     
     --- new event ---  # clic (unique) sur l'ellipse
    click on scene
    wait for input : False
     
     --- new event --- # double clic sur l'ellipse
    click on scene
    wait for input : False
    click on ellipse
    Pouvez vous me dire ce que j'ai mal compris?

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Si un event n'est pas pris en compte, il faut le renvoyer dans la boucle évènementielle.

    Comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        def mousePressEvent(self, e):
            print(' --- new event --- ')
            print('click on scene')
            print(f'wait for input : {self.wait_for_input}')
            if self.wait_for_input :
                ellipse = MyEllipse(e.scenePos().x(), e.scenePos().y(), 70, 70)
                self.addItem(ellipse)
                print(ellipse)
                self.wait_for_input = False
     
            else:
                QtWidgets.QGraphicsScene.mousePressEvent(self, e)
    pas de e.accept() ou e.ignore() ici.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2018
    Messages : 29
    Points : 64
    Points
    64
    Par défaut
    Ok, ça fonctionne désormais,
    merci!

    hum, ça me laisse un peu perplexe cependant,
    pourquoi l'event est-il stoppé?
    et pourquoi rappeler la fonction mousePressEvent ne nous fait pas entrer dans une boucle infinie
    Je suppose que la réponse est la gestion de la boucle événementielle, je vais creuser ça.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/04/2010, 13h57
  2. Réponses: 4
    Dernier message: 20/10/2009, 18h34
  3. [QGraphicsItem] Propagation Hover Events
    Par Gulish dans le forum Qt
    Réponses: 10
    Dernier message: 22/07/2009, 15h19
  4. propagation événement avec dispatch event
    Par john123 dans le forum Flex
    Réponses: 3
    Dernier message: 19/02/2009, 13h25
  5. Propagation Event sur le Parent
    Par Moustico dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/09/2008, 15h40

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