<QApplicationStatic>
| Header: | #include <QApplicationStatic> |
宏
(since 6.3) | Q_APPLICATION_STATIC(Type, VariableName, ...) |
宏文档
[since 6.3] Q_APPLICATION_STATIC(Type, VariableName, ...)
该宏扩展了Q_GLOBAL_STATIC ,并创建了一个类型为QGlobalStatic 的全局静态对象,名称为VariableName ,该对象由可变个数参数初始化,且行为上相当于指向Type 的指针,其中该类型的实际生命周期与QCoreApplication 绑定。 由 Q_APPLICATION_STATIC 创建的对象会在首次使用时自行初始化,这意味着它不会增加应用程序或库的加载时间。此外,该对象在所有平台上均以线程安全的方式进行初始化。
与Q_GLOBAL_STATIC 不同(该类型仅在程序退出时才被销毁),此处的类型实际生命周期与QCoreApplication 的生命周期绑定。这使其成为存储半静态QObject的理想选择,这些QObject也应在QCoreApplication 被销毁后随之销毁。 这意味着,一旦QCoreApplication 发出destroyed信号,该类型就会被删除。如果此时已创建了一个新的QCoreApplication ,则允许在再次访问该对象时将其重新创建。
由于该值与QCoreApplication 绑定,因此仅当存在有效的QCoreApplication::instance()时才应访问它。在QCoreApplication 创建之前或销毁之后访问该对象将产生警告,并可能导致不可预测的行为。
该宏的典型用法如下,位于全局作用域中(即任何函数体之外):
Q_APPLICATION_STATIC(MyQObjectType, staticType, "some string", function())请注意,以可变参数形式传递给此宏的参数会在每次对象构造时被求值,因此在上例中,如果对象被重新创建,则函数function 将会被调用多次。
除了值也与 `QCoreApplication` 的生命周期绑定外,该宏的行为与 `Q_GLOBAL_STATIC()` 完全相同。更多信息请参阅该宏的文档。
线程安全保证
Q_APPLICATION_STATIC 宏可确保对象仅被初始化一次(在QCoreApplication 的生命周期内),即使有多个线程试图并发访问该对象也是如此。 这是通过为每个对象提供一个互斥锁来实现的;应用程序和库开发人员需要注意,其对象在构造时该互斥锁处于锁定状态,因此绝不能重新进入同一对象的初始化过程,否则将导致死锁。
对象的销毁过程不具备线程安全性:一旦QCoreApplication 的析构函数开始运行,用户代码就绝不能访问该对象。用户代码必须采取措施确保这种情况不会发生,例如在主线程的事件循环退出后不再访问该对象。
与 `Q_GLOBAL_STATIC` 类似,`Q_APPLICATION_STATIC` 对于对象创建完成后对其的访问不提供任何线程安全保证。用户代码必须确保不会发生竞争性数据访问。
如果此操作创建的对象是 `QObject`,则与其关联的线程将是成功创建该对象的那个线程。 该对象将由主线程销毁,因此建议在销毁前将moveToThread()调用的目标设为主线程或无线程。如果无法保证由主线程来初始化该对象,则在相关类的构造函数中执行此操作是一个合理的解决方案。
该宏在 Qt 6.3 中引入。
另请参阅 Q_GLOBAL_STATIC 和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.