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 :

émettre un signal à un QMdiSubWindow


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 31
    Par défaut émettre un signal à un QMdiSubWindow
    Bonjour,

    J'essaie d'émettre un signal au QMdiSubWindow Active depuis ma classe principale QMainWindow à chaque fois qu'un boutton ( moveButton ) a été coché
    Je procède comme suit :

    dans ma classe QMainWindow :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    self.connect (self.moveButton , SIGNAL("clicked()") , self.send_move_signal)
     
    def send_move_signal(self):
        self.moveButton.setChecked(True)
        self.mdiArea.activeSubWindow().emit ( SIGNAL("moveButton_activated"))
    et dans ma classe qui représente le QMdiSubWindow , je relie les signaux aux méthodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        class MdiWid ( QWidget , Ui_SubMdiWindow):
            def __init__(self,parent=None):
                super(MdiWid,self).__init__(parent)
                self.connect (self , SIGNAL("moveButton_activated"),self.updateMoveState)
     
            def updateMoveState(self):
                self.moveButton_activated = True
                print("moveButton_Activated")
    Mais cela ne marche pas , je ne sais pas pourquoi ?

    De plus , je voudrais coder des fonctions qui seront accessibles depuis QMainWindow ( exemple : un click sur un button ) mais qui agira sur la fenêtre active
    comment peut-on réaliser cela ?

    Si possible, la façon la plus pratique : On met les fonctions à l'intérieur de la classe du Widget ou bien dans le QMainWindow ?

    Cordialement,

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Il serait vraiment nécessaire que tu abandonnes les syntaxes "old style" pour les signal-slot, cette syntaxe est officiellement dépréciée depuis de nombreuses années.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    self.clicked.connect(self.send_move_signal) # je me demande bien ce que représente self ici
    self.mdiArea.activeSubWindow().moveButton_activated.emit()
    self.moveButton_activated.connect(self.updateMoveState)
    Pourquoi ta classe MdiWid hérite-t-elle de Qwidget ? Si elle hérite de QMdiSubWindow c'est déjà bien assez.

    Pour ton problème, tu fais usage d'un signal de ton cru "moveButton_activated" que tu n'as pas initialisé et que, dans une méthode, tu transformes en booléen.

    Ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            def updateMoveState(self):
                self.moveButton_activated = True
    Alors, un signal ou un booléen ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 31
    Par défaut
    Merci à pour votre réponse ,

    Oui l'histoire du nom du booléen qui coïncide avec le nom du signal est juste un oubli. ce n'était pas mon intention.

    Je tiens à préciser que j'utilise deux scripts python : l'un pour ma classe principal QMainWindow et l'autre pour ma classe secondaire à la quelle je fait appel à chaque fois que j'ouvre un fichier. J'ai fait la conception des deux sur QtDesigner , c'est pour cela que ma deuxième classe hérite à la fois de QWidget ( c'est un Widget à la base ) et de Ui_SubMdiWindow ( issu du code de pyuic 4 ) , tout comme ma classe principale hérite de QMainWindow et de Ui_MainWindow.

    J'ai tenu compte de vos remarques , j'ai donc initialisé le signal suivant , après la définition de chacune des deux classes et avant le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    active_move_button = pyqtSignal()
    Dans mon script princpal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    self.moveButton.clicked.connect(self.send_move_signal)
    def send_move_signal(self):
        self.moveButton.setChecked(True)
        self.mdiArea.activeSubWindow().active_move_button.emit()
    dans le constructeur du script du widget :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.active_move_button.connect(update_move_state)
    le résultat est que j'obtiens la même erreur que celle que j'obtiens lorsque j'essaie d'utiliser des méthodes qui sont à l'intérieur de mon Widget ( en rapport avec ma deuxième question , comment faire pour définir ces méthodes et les faire fonctionner sur la fenêtre active ? )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError : 'QMdiSubWindow' object has no attribute 'active_move_button'
    cordialement

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Si tu as mis la définition du signal avant __init__() cela n'empêche pas que tu doives utiliser la référence à l'instance.

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.active_move_button.connect(self.update_move_state)

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 31
    Par défaut
    Oui , désolé . Juste une faute de recopie.

    Je n'ai pas oublié le self. dans mon script et pourtant j'ai le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AttributeError : 'QMdiSubWindow' object has no attribute 'active_move_button'

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 31
    Par défaut
    C'est bon , au fait il suffisait d'utiliser la méthode widget() de QMdiSubWindow ( comment j'ai fait pour louper cette méthode ) pour accéder directement au widget et à ses méthodes , signaux .. etc

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

Discussions similaires

  1. [QThread] signal s'arrêtant d'émettre pendant l'exécution d'un thread
    Par eric_vi dans le forum Multithreading
    Réponses: 1
    Dernier message: 16/04/2010, 09h38
  2. impossible d'émettre un signal
    Par jppaysan dans le forum Qt
    Réponses: 4
    Dernier message: 24/12/2007, 16h32
  3. Mettre a jour un tableau de GtkEntry dans un signal
    Par kitsune dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 26/05/2007, 22h25
  4. [VB6] mettre en commentaires...
    Par nd25 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/04/2004, 15h15

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