Question

J'ai une application Qt qui utilise QPointers pour afficher une nouvelle interface utilisateur (Widgets) Dialogs. L'application principale peut avoir de nombreuses du même widget de chargé avec des données différentes. Le problème que je vais avoir est de supprimer et de libérer la mémoire pour chaque gadget. Si je surveille l'utilisation de la RAM du programme, chaque fois que je clique sur le bouton pour ouvrir un de ces nouveaux widgets, il augmente le bélier et quand je ferme le widget, il ne semble pas être en libérant le bélier. Je l'ai essayé d'utiliser deleteLater et d'autres solutions, mais continuez à obtenir des collisions dans le programme.

Certains exemples de code est ici:

QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();

appellera le widget de « ListReservations » qui est déclaré comme QDialog (non modal). Dans cette boîte de dialogue je puis un bouton pour fermer la fenêtre qui appelle la fente QWidget::close().

Je suppose que la question est de savoir comment mon programme principal (qui a le QPointer) savoir quand la boîte de dialogue est fermée et libérer la boîte de dialogue et (si possible) supprimer le pointeur pour sauver encore plus de mémoire ...

Je pensais que vous pourriez être en mesure de faire un QConnect() à l'objet QPointer, mais je ne peux pas sembler trouver des signaux ou des fentes permettant le passage du pointeur, beaucoup moins envoyer le signal une fois la boîte de dialogue est en effet fermé et prêt pour la suppression.

Peut-être que je besoin d'une sorte de fonction dans le programme principal qui prend un objet pointeur générique et ensuite l'appel QDialog qui avant d'appeler son propre logement à proximité? Dans cette fonction il se passer à détruire? Il suffit de jeter des idées que j'ai essayé de mettre en œuvre, mais a échoué à ....

Je ne pense pas que je peux réutiliser le même pointeur ailleurs parce qu'en théorie, vous pouvez avoir plusieurs fenêtres ListReservations ouvertes en même temps.

Était-ce utile?

La solution

Assurez-vous que vous définissez l'indicateur d'attribut Qt::WA_DeleteOnClose sur votre boîte de dialogue à l'aide QWidget::setAttribute(). Cela devrait faire en sorte que la boîte de dialogue est correctement détruit quand il est fermé. Voir documentation Qt pour plus de détails.

En supposant que la mémoire est correctement libérée, le pointeur doit s'invalider, de la documentation Qt :

  

Un pointeur gardé, QPointer,   se comporte comme un pointeur de la normale C T s *,   sauf qu'il est automatiquement réglé sur   0 lorsque l'objet référencé est   détruits (contrairement à des pointeurs normaux C ++,   qui deviennent des « pointeurs ballants » dans   de tels cas)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top