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 :

Destruction apparement impropre d'une fenêtre Qdialog


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 2
    Par défaut Destruction apparement impropre d'une fenêtre Qdialog
    Bonjour,

    j'ai le message d'erreur suivant : RuntimeError: underlying C/C++ object has been deleted
    Après quelques recherches dans les forums, je constate que ce message provient de contextes divers.
    Voilà la situation qui m'y conduit.
    - Un objet QObjet envoie un signal self . emit (SIGNAL('update')) pour indiquer qu'il a été modifié et qu'il convient de raffraichir l'interface (une QGraphicsScene visualisée dans un QGraphicsView d'une fenêtre Qdialog).
    - la fenêtre se connecte à ce signal dans sa fonction __init__ par self . connect (self . station, SIGNAL ('update'), self . scene . update)
    - cette fenêtre peut être ouverte en plusieurs exemplaires et tous se raffraichissent automatiquement (ça marche parfaitement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    newStationGUI = CGUIStationDialog (self . device . getOtherStation (self . station))
    newStationGUI . show ()
    newStationGUI . exec_ ()
    - à sa fermeture j'ai mis (sans conviction, ni succès d'ailleurs) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def close (self) :
        self . station . disconnect (self, SIGNAL ('update'), self . scene . update)
        super (CGUIStationDialog , self) . close ()
    En cas de fermeture d'une des instances de la fenêtre, lors de l'émission du signal de rafraichissement apparait le message RuntimeError: underlying C/C++ object has been deleted

    Vos lumières ?

    Merci d'avance

    Boula

  2. #2
    Expert confirmé

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

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

    C'est un petit peu difficile de visualiser ton schéma mais tu peux toujours essayer ceci:

    1. Au lieu de close() dans le dialog, utilises accept()

    2.Ne déconnectes pas, selon moi, l'instance du dialog étant détruite (et ça c'est sur avec accept()) la déconnexion n'a aucune utilité.

    Cela dit, ton message d'erreur est courant et souvent peu critique, l'exemple le plus courant étant le garbage collector de python plus rapide que le destructeur C++ appelé lors de la suppression d'un objet Qt.

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 2
    Par défaut
    Bonjour,

    merci pour ta réponse rapide. Malheureusement, ça n'est pas ça.
    Dans ma description, (je ne voulais pas inonder avec des km de lignes de code) Y aurait-il des info que tu souhaiterais que je détaille ?

    Merci

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 816
    Billets dans le blog
    1
    Par défaut
    Salut

    Ca m'est déjà arrivé d'avoir ce message. En général, c'est toujours dans un truc un peu tordu où en final je me retrouve en train d'adresser un objet qui est (probablement) déjà effacé...

    Déjà tu n'a pas besoin de faire un disconnect. Si ta fenêtre disparait, la déconnection sera automatique.
    Ensuite, au lieu de surcharger la fonction close() je te propose d'utiliser la fonction closeEvent()
    Cette fonction est implicite dans tout objet Gui et elle est automatiquement appelée quand l'objet disparait.
    Donc dans cette fonction tu mets tout ce dont tu penses avoir besoin pour libérer tes objets internes. Mais à mon avis, si c'est juste pour faire un disconnect() ben même pas la peine quoi...

    Donc si comme je le pense tu as un QDialog avec un simple bouton "Quitter", tu connectes juste le signal clicked() de ce bouton au self SLOT("close()") et tu laisses le closeEvent() gérer ce qu'il doit faire à la fermeture de la fenêtre...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [QtGui] Gestion d'une fenêtre QDialog personnalisée
    Par mokochan dans le forum PyQt
    Réponses: 1
    Dernier message: 11/06/2013, 15h53
  2. Probleme de destruction d'une fenêtre SDL 1.3
    Par bubkadk dans le forum SDL
    Réponses: 2
    Dernier message: 26/07/2011, 12h13
  3. Comment changer l'apparence d'une fenêtre
    Par bandit boy dans le forum C++Builder
    Réponses: 13
    Dernier message: 26/06/2011, 16h12
  4. Pb sur l'apparation d'une fenêtre
    Par Mugen RX dans le forum wxPython
    Réponses: 1
    Dernier message: 06/12/2006, 16h23
  5. Destruction automatique d'une fenêtre d'attente
    Par Depteam1 dans le forum MFC
    Réponses: 4
    Dernier message: 20/09/2005, 13h40

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