Obtenez une liste de tous les QObjects créés dans une Application

pour obtenir une liste de tous les QWidgets créés dans une application, nous pouvons simplement appeler QApplication::allWidgets().

j'ai lu la documentation, et je n'ai rien trouvé de tel pour obtenir une liste de tous les QObjects. Si une application crée des QObjects autonomes qui ne sont pas des QWidgets, Je n'ai pas de telle fonction à utiliser.

Est-il une méthode pour obtenir une telle liste?

11
demandé sur Petr Viktorin 2010-02-26 13:48:23

1 réponses

Pour commencer, il est important de comprendre la différence entre le QObject et QWidget classes.

classe QObject

les instances de QObject ont un pointeur vers leur parent qui peut être ou non un pointeur nul. Il est tout à fait légitime de créer une instance QObject sans parent tant que vous comprenez que c'est votre responsabilité pour la durée de vie de cette instance, c'est-à-dire si vous ne delete si vous avez des fuites de mémoire.

classe QWidget

bien qu'il semble que vous puissiez créer un QWidget sans parent, vous ne pouvez pas. Lorsque vous créez une instance D'un QWidget "sans parent" (c'est-à-dire en fournissant un pointeur null ou en le laissant par défaut sur un pointeur null), c'est le parent qui obtient effectivement la valeur QApplication de votre application1 instance.

Est-il une méthode pour obtenir une telle liste?

Non. La raison QApplication::allWidgets() fonctionne est due au fait que tout QWidget les instances ont un pointeur vers elles qui est stocké dans votre seule instance de QApplication. Il n'y a pas de stock central de pointeurs QObject et donc pas de moyen intégré de les récupérer.

un moyen de contourner cela est d'assurer vous-même que toutes les instances de QObjects (ou les instances de classes qui héritent de QObject) ont un parent valide. Vous pouvez alors utiliser les fonctions de QObject children (), findChild () et findChildren () pour obtenir des pointeurs vers ces objets.

ce sont des outils puissants, et comme tout ce qui est puissant,utilisez-les avec soin! Assurez-vous de bien comprendre la durée de vie des objets C++ avant de les utiliser dans le code de production.




Notes:

  1. QApplication hérite de QCoreApplication qui hérite de QObject. Il y a quelques restrictions placé sur la façon dont QApplication est utilisé par le Qt Framework.
10
répondu Samuel Harmer 2011-11-30 16:09:05