<QApplicationStatic>

Header: #include <QApplicationStatic>

Macros

(since 6.3) Q_APPLICATION_STATIC(Type, VariableName, ...)

Descripción detallada

Documentación de macros

[since 6.3] Q_APPLICATION_STATIC(Type, VariableName, ...)

Esta macro extiende Q_GLOBAL_STATIC y crea un objeto global y estático de tipo QGlobalStatic, de nombre VariableName, inicializado por los argumentos variadic, y que se comporta como un puntero a Type, donde el tiempo de vida real del tipo está ligado a QCoreApplication. El objeto creado por Q_APPLICATION_STATIC se inicializa a sí mismo en el primer uso, lo que significa que no incrementará el tiempo de carga de la aplicación o de la librería. Además, el objeto se inicializa de forma segura en todas las plataformas.

A diferencia de Q_GLOBAL_STATIC, donde el tipo sólo se destruye al salir del programa, aquí el tiempo de vida real del tipo está ligado al tiempo de vida de QCoreApplication. Esto lo hace ideal para almacenar QObjects semiestáticos, que también deben ser destruidos una vez que QCoreApplication es destruido. Esto significa que el tipo se borrará una vez que QCoreApplication emita la señal de destrucción. Se permite que el objeto sea recreado cuando se acceda a él de nuevo, si también se ha creado un nuevo QCoreApplication.

Dado que el valor está vinculado a QCoreApplication, sólo se debería acceder a él si existe un QCoreApplication::instance() válido. Acceder a este objeto antes de que se cree QCoreApplication o después de que se destruya producirá advertencias y puede tener un comportamiento impredecible.

El uso típico de esta macro es el siguiente, en un contexto global (es decir, fuera de cualquier cuerpo de función):

Q_APPLICATION_STATIC(MyQObjectType, staticType, "some string", function())

Tenga en cuenta que los argumentos pasados de forma variádica a esta macro se evalúan cada vez que se construye el objeto, por lo que en el ejemplo anterior, la función function se llamará más de una vez si se vuelve a crear el objeto.

Aparte de que el valor también está ligado al tiempo de vida de QCoreApplication, esta macro se comporta de forma idéntica a Q_GLOBAL_STATIC(). Para más información, consulte la documentación de esta macro.

Garantías de subprocesos

La macro Q_APPLICATION_STATIC asegura que el objeto es inicializado sólo una vez (por tiempo de vida de QCoreApplication), incluso si múltiples hilos intentan acceder concurrentemente al objeto. Esto se hace proporcionando un mutex por objeto; los desarrolladores de aplicaciones y librerías necesitan ser conscientes de que su objeto será construido con este mutex bloqueado y por lo tanto no deben volver a inicializar el mismo objeto, o se producirá un punto muerto.

No hay seguridad de hilos en la destrucción del objeto: el código de usuario no debe acceder a este objeto una vez que el destructor de QCoreApplication comience a ejecutarse. El código de usuario debe asegurarse de que esto no ocurra, por ejemplo, no accediendo a él una vez que el bucle de eventos del hilo principal haya salido.

Al igual que Q_GLOBAL_STATIC, Q_APPLICATION_STATIC no proporciona garantías de seguridad para los accesos al objeto una vez que la creación ha finalizado. Depende del código de usuario asegurarse de que no se produzcan accesos no deseados a los datos.

En el caso de que el objeto creado por esta operación sea un QObject, su hilo asociado será el que haya conseguido crearlo. Será destruido por el hilo principal, por lo que es aconsejable un moveToThread() al hilo principal o a ningún hilo antes de la destrucción. Hacerlo desde el constructor de la clase en cuestión es una solución sensata si no se puede garantizar que el hilo principal será el que inicialice el objeto.

Esta macro se introdujo en Qt 6.3.

Ver también Q_GLOBAL_STATIC y 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.