|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre éprouvé
![]() Étudiant Inscription : juin 2012 Messages : 272 ![]() |
Hello,
J'ai une fenêtre contenant entre autre un Widget perso (dérivé de QWidget). Ce widget perso est créé dans du code auto généré, et devrait être supprimé lorsque la fenêtre est supprimée (car la fenêtre est son parent). Sauf que ce widget n'est jamais supprimé. Du coup c'est fiable ce système de suppression des widgets fils ? Ou il faut tout supprimer à la main (au risque de se taper des heap corruptions si un objet est delete plusieurs fois) ? Et deuxième question, si les signaux / slots de 2 widgets sont connectés, puis qu'un des deux widgets est supprimé, se prendre un seg fault au niveau de l'emit est normal ? Il faut les déconnecter à la main avant la suppression ? (c'est d'ailleurs |
|
|
00
|
|
|
#2 |
![]() ![]() |
Salut,
Si le parent de ton widget perso est correctement défini, oui, le système s'occupera de tout. N'oublie cependant pas que la fermeture de ta fenêtre ne signifie pas forcément la destruction de celle-ci, car elle peut etre réouverte sans avoir été recréer Le tout dépend au final de comment tu crées le widget parent de ton widget perso Pour ta deuxième question, cela dépend fortement du widget qui est détruit... Si le widget détruit est celui qui émet le signal, il n'y a strictement aucun problème : le signal n'étant plus émis, il ne risque pas d'être envoyé à quelque chose qui n'existe plus Si le widget détruit est celui dont un slot est connecté, alors, effectivement, il faut veiller à le déconnecter du signal dans l'autre widget pour éviter les problèmes Si chacun des widget émet un signal en direction d'un slot de l'autre widget, il est peut etre intéressant de revoir ton desing
__________________
en bas de page
|
|
|
10
|
|
|
#3 | ||||
|
Membre éprouvé
![]() Saâd HessaneIngénieur développement logiciels Inscription : avril 2008 Messages : 308 ![]() |
Citation:
Si tu détruis le parent, tous les objets fils seront détruit. Si tu détruis un fils, il émet le signal destroyed auquel est connecté le parent pour qu'il le supprime de sa liste d'enfants. Plus de détail : http://qt-project.org/doc/qt-4.8/objecttrees.html Citation:
Peux-tu poster un code ? [EDIT] @koala01 : Je n'ai remarqué ta réponse qu'après avoir poster Citation:
Citation:
|
||||
|
|
10
|
|
|
#4 | |
![]() ![]() |
Citation:
Bon, c'étaient des cas limites, mais, quand tu as une vue tabulaires dont certains signaux sont connectés sur des QGraphicsItems qui se trouvent dans une vue tout à fait différente, et que, de l'autre coté tu as des QGraphicsItems qui sont connectés à des slots de ta vue tabulaire, même la version 4.7 a tendance à perdre un peu les pédales lorsque tu détruit une vue mais pas l'autre
__________________
en bas de page
|
|
|
|
00
|
|
|
#5 | ||
|
Membre éprouvé
![]() Étudiant Inscription : juin 2012 Messages : 272 ![]() |
Après avoir regardé plus en détail mon code, l'erreur était vraiment conne :/
La fenêtre détruit bien le widget custom (vérifié avec des cout dans les destructeurs) mais le widget reste "plus ou moins" valide. Code :
Bon utiliser un objet détruit est clairement une erreur... mais comme la fonction s'exécutait normalement sans l'emit je ne pensais pas l'objet détruit. Bref une erreur stupide, merci pour les précisions sur le mécanisme de suppression des widgets. edit: Le fait que l'objet est valide après sa destruction doit venir du contexte multithread, il doit rester en cache quelques part je pense, m'enfin design changé, plus de problèmes. |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com