<QApplicationStatic>
| Header: | #include <QApplicationStatic> |
Macros
(since 6.3) | Q_APPLICATION_STATIC(Type, VariableName, ...) |
Documentation des macros
[since 6.3] Q_APPLICATION_STATIC(Type, VariableName, ...)
Cette macro étend Q_GLOBAL_STATIC et crée un objet global et statique de type QGlobalStatic, de nom VariableName, initialisé par les arguments variadiques, et qui se comporte comme un pointeur sur Type, où la durée de vie réelle du type est liée à QCoreApplication. L'objet créé par Q_APPLICATION_STATIC s'initialise lors de la première utilisation, ce qui signifie qu'il n'augmentera pas le temps de chargement de l'application ou de la bibliothèque. En outre, l'objet est initialisé de manière sûre pour les threads sur toutes les plates-formes.
Contrairement à Q_GLOBAL_STATIC où le type n'est censé être détruit qu'à la sortie du programme, ici la durée de vie réelle du type est liée à la durée de vie de QCoreApplication. Cela le rend idéal pour stocker des QObjects semi-statiques, qui doivent également être détruits lorsque QCoreApplication est détruit. Cela signifie que le type sera supprimé une fois que le QCoreApplication émettra le signal "destroyed". L'objet peut être recréé lorsqu'on y accède à nouveau, si un nouveau QCoreApplication a également été créé.
Étant donné que la valeur est liée à QCoreApplication, il ne faut jamais y accéder que s'il existe un QCoreApplication::instance() valide. L'accès à cet objet avant la création de QCoreApplication ou après sa destruction produira des avertissements et peut avoir un comportement imprévisible.
L'utilisation typique de cette macro est la suivante, dans un contexte global (c'est-à-dire en dehors de tout corps de fonction) :
Q_APPLICATION_STATIC(MyQObjectType, staticType, "some string", function())
Notez que les arguments passés de manière variable à cette macro sont évalués à chaque fois que l'objet est construit, donc dans l'exemple ci-dessus, la fonction function sera appelée plus d'une fois si l'objet est recréé.
Outre le fait que la valeur est également liée à la durée de vie de QCoreApplication, cette macro se comporte de manière identique à Q_GLOBAL_STATIC(). Veuillez consulter la documentation de cette macro pour plus d'informations.
Garanties de threading
La macro Q_APPLICATION_STATIC garantit que l'objet n'est initialisé qu'une seule fois (par durée de vie d'un QCoreApplication), même si plusieurs threads tentent d'accéder simultanément à l'objet. Les développeurs d'applications et de bibliothèques doivent savoir que leur objet sera construit avec ce mutex verrouillé et qu'ils ne doivent donc pas réintroduire l'initialisation du même objet, sous peine de blocage.
Il n'y a pas de sécurité thread sur la destruction de l'objet : le code utilisateur ne doit pas accéder à cet objet une fois que le destructeur QCoreApplication commence à s'exécuter. Le code utilisateur doit s'arranger pour que cela ne se produise pas, par exemple en n'accédant pas à l'objet une fois que la boucle d'événements du thread principal est terminée.
Comme Q_GLOBAL_STATIC, Q_APPLICATION_STATIC ne fournit aucune garantie de sécurité pour les accès à l'objet une fois la création terminée. C'est au code utilisateur de s'assurer qu'aucun accès inapproprié aux données n'a lieu.
Si l'objet créé par cette opération est un QObject, son thread associé sera celui qui a réussi à le créer. Il sera détruit par le thread principal, il est donc conseillé d'effectuer un moveToThread() vers le thread principal ou vers aucun thread avant la destruction. Le faire à partir du constructeur de la classe en question est une solution raisonnable si l'on ne peut pas garantir que le thread principal sera celui qui initialisera l'objet.
Cette macro a été introduite dans Qt 6.3.
Voir aussi Q_GLOBAL_STATIC et QGlobalStatic.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.