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 :

Problème pour quitter une QApplication


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut Problème pour quitter une QApplication
    Bonjour,
    En fait lorsque je quitte l'application elle quitte en seg fault, mais le problème est que je comprends pas trop la trace fourni par gdb.
    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
     
    #0  0x00007fffdfb322b1 in QVTKWidget::SetRenderWindow (this=0x92d0f0, w=0x0) 
    #1  0x00007fffdfb326d7 in ~QVTKWidget (this=0x92d0f0, __in_chrg=<value optimized out>)
    #2  0x00007fffe148c9ee in qDeleteInEventHandler (o=0x92d0f0) 
    #3  0x00007fffe148f547 in QObject::event (this=0x92d0f0, e=0x986ab0)
    #4  0x00007fffdfb321f1 in QVTKWidget::event (this=0x92d0f0, e=0x986ab0)
    #5  0x00007fffe02bd7e5 in QApplicationPrivate::notify_helper (this=0x74a080, receiver=0x92d0f0, e=0x986ab0) at kernel/qapplication.cpp:4242
    #6  0x00007fffe02c01db in QApplication::notify (this=0x7fffffffd660, receiver=0x92d0f0, e=0x986ab0) at kernel/qapplication.cpp:4207
    #7  0x00007fffe1478727 in QCoreApplication::notifyInternal (this=0x7fffffffd660, receiver=0x92d0f0, event=0x986ab0) at kernel/qcoreapplication.cpp:704
    #8  0x00007fffe147d917 in QCoreApplication::sendEvent (receiver=0x92d0f0, event=0x986ab0) at ../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:215
    #9  0x00007fffe1478cfc in QCoreApplicationPrivate::sendPostedEvents (receiver=0x0, event_type=52, data=0x749aa0) at kernel/qcoreapplication.cpp:1345
    #10 0x00007fffe147900c in QCoreApplication::sendPostedEvents (receiver=0x0, event_type=52) at kernel/qcoreapplication.cpp:1238
    #11 0x00007fffe14791b2 in QCoreApplication::exec () at kernel/qcoreapplication.cpp:988
    #12 0x00007fffe02c0218 in QApplication::exec () at kernel/qapplication.cpp:3570
    ....
    J'ai l'impression qu'il ya un problème au niveau de l'event loop Qt mais je vois pas quoi.
    Je poste pas de code car je travaille sur un framework et il sera difficile poster les sources.
    C'est pourquoi je cherche une idée, une suggestion qui pourrait m'aider parce que j'ai tous essayé.
    Je précise que j'utilise 3 connect pour voir ce qu'il se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    QObject::connect(&app, SIGNAL(lastWindowClosed()), this, SLOT(windowClosed())); // appelé
    QObject::connect(&app, SIGNAL(aboutToQuit()), this, SLOT(exit()));// pas appelé
    QObject::connect(&app, SIGNAL(destroyed()), this, SLOT(printDestruction())); //pas appelé
    windowClosed() : j'affiche juste que la dernière fenetre visible viens d'êttre fermée, mais quand j'affiche qApp->closeDown() il renvoie toujours 0 (donc il reste des fenêtre pas fermées ?).

    Le signal aboutToQuit() n'a pas le temps d'être émis car la seg fault survient apres le slot(que j'ai crée) windowClosed() ou avant exit() (je sais pas trop).
    Idem pour le signal destroyed().
    Je precise que même avec un setAttribute(Qt::WA_QuitOnClose) ça ne marche pas.

    Merci de votre aide.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    #0 0x00007fffdfb322b1 in QVTKWidget::SetRenderWindow (this=0x92d0f0, w=0x0)
    #1 0x00007fffdfb326d7 in ~QVTKWidget (this=0x92d0f0, __in_chrg=<value optimized out>)
    je dirais qu'il y as un problème dans ~QVTKWidget.

    Tu est de ne pas utiliser des choses déjà détruite?
    Tu partage des données?

  3. #3
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Le seul QVTKWidget que j'utilise, je le détruit une seul fois avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      if(widget != 0)
        {
          widget->deleteLater();
          widget=0;
        }
    Sachant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete widget;  // provoque une erreur
    De plus à aucun moment je n'appelle la méthode indiquée à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QVTKWidget::SetRenderWindow
    Je ne sais pas ce qu'il se passe.
    Donc ce serait plutot un probleme VTK que Qt(event loop, manière de quitter ou autre) ?

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    Je ne connais pas du tout VTK, mais j'ai eu le même type de soucis avec Qwt, ça plantait à la fermeture car mon objet graphique essayait de détruire l'objet courbe qui avait déjà été détruit auparavant (car pas alloué avec new).

    Je te conseille de regarder dans la doc de ton VTKWidget s'il ne prend pas 'ownership' de certains objets, objets qui seraitn déjà détruits au moment de la destruction du widget...

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Au lieu de pointeur brut, tu peut utilise des QWeakPtr sur les QObject.
    Ainsi, s'il est détruit, le smart_ptr est automatique mise à 0.

  6. #6
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    C'était bel et bien problème au niveau VTK.
    Il fallait en fait utiliser les objets fourni par le QVTKWidget (via GetRenderWindow, GetInteractor(), ...), je vais pas rentrer dans les détails mais si quelqu'un souhaite en savoir plus, je développerai plus longuement.

    Concernant les QWeakPointer, je ne savais pas que cela existait (je pensais que cela existait uniquement dans la lib boost), mais j'y penserai à l'avenir.

    Merci beaucoup de votre aide.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/12/2004, 18h01
  2. Problème pour positionner une liste déroulante
    Par ouckileou dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/09/2004, 01h05
  3. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  4. [MSSQL] Problème pour sélectionner une seule occurence
    Par Tinfolley dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/07/2004, 09h02
  5. Réponses: 3
    Dernier message: 29/08/2003, 10h57

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