插件生命周期

要能够编写 Qt Creator 插件,您必须了解当您启动或关闭 Qt Creator 时插件管理器执行的操作步骤。本节详细描述了插件经历的过程和状态。

您可以通过设置环境变量 QT_LOGGING_RULESqtc.extensionsystem*=true 并运行 Qt Creator 来获得更多有关启动 Qt Creator 时发生的情况的信息,这将启用与插件相关的调试输出的日志记录。

当您启动 Qt Creator 时,插件管理器执行以下操作

  1. 在其搜索路径中查找所有动态库,并读取它们的元数据。所有没有元数据和没有 org.qt-project.Qt.QtCreatorPlugin IID 的库将被忽略。这是在元数据不完整的情况下加载插件的潜在失败点。
  2. 为每个插件创建一个 ExtensionSystem::PluginSpec 类的实例。此类是一个包含插件规范中所有信息的容器,同时跟踪插件的状态。您可以通过插件管理器的 plugins() 函数获取 ExtensionSystem::PluginSpec 实例。
  3. 将插件设置为 Read 状态。
  4. 验证每个插件的依赖项是否存在且兼容。有关插件依赖项的更多信息,请参阅 插件元数据
  5. 将插件设置为 Resolved 状态。
  6. 将所有插件排序到一个称为 加载队列 的列表中,其中插件的依赖项位于插件之后(但不一定是 直接 之后)。它将确保我们按正确的顺序加载和初始化插件。
  7. 加载插件的库,并按加载队列的顺序创建它们的 IPlugin 实例。在此阶段,将调用插件构造函数。在创建其他插件所依赖的插件之前创建了这些插件。
  8. 将插件设置为 Loaded 状态。
  9. 按加载队列的顺序调用所有插件的 initialize() 函数。在 initialize 函数中,插件应确保所有已导出的接口都已设置并可供其他插件使用。插件可以假设它们所依赖的插件已设置他们的已导出接口。例如,Core 插件设置了 Core::ActionManagerCore::EditorManager 和所有其他公开可用的接口,因此其他插件可以请求并使用它们。

    插件 initialize() 函数是以下操作的好地方

  10. 将插件设置为 Initialized 状态。
  11. 以加载队列的逆序调用所有插件中的 extensionsInitialized() 函数。在 extensionsInitialized 函数之后,插件应该已经完全初始化、设置并且正在运行。插件可以假设它所依赖的插件已经完全配置,并可以完成其他插件可以扩展的部分的初始化。例如,Core 插件假设所有插件都注册了自己的行为,并完成了动作管理器的初始化。
  12. 将插件设置为 正在运行 状态。

启动结束后,Core 插件的 Core::ICore 发送两个信号。在 Qt Creator UI 显示之前发送 coreAboutToOpen(),之后发送 coreOpened()。

启动后,当 Qt Creator 的事件循环运行时,插件管理器以加载队列的逆序顺序调用所有插件的 delayedInitialize() 函数。这些调用在主线程上完成,但通过延迟几毫秒来确保 Qt Creator 的响应性。在 delayedInitialize 函数中,插件可以执行非关键初始化,如果 these 在启动时完成,可能会不必要地延迟显示 Qt Creator UI。

所有延迟初始化完成后,PluginManager 会发送 initializationDone() 信号。

在关闭之前,Core 插件 Core::ICore 发送 coreAboutToClose() 信号。之后,插件管理器开始关闭序列。

  1. 以加载队列的顺序调用所有插件的 aboutToShutdown() 函数。插件应在此处采取加快实际关闭的措施,例如断开不必要调用的信号。如果插件需要延迟实际关闭一段时间,例如需要等待外部进程完成以进行干净关闭,则插件可以从该函数中返回 ExtensionSystem::IPlugin::AsynchronousShutdown。这将使插件管理器等待下一步,并保持主事件循环运行,直到所有请求 AsynchronousShutdown 的插件都已发送 asynchronousShutdownFinished() 信号。
  2. 通过删除其 ExtensionSystem::IPlugin 实例以加载队列的逆序顺序销毁所有插件。在此阶段将调用插件析构函数。插件应自行清理,例如释放内存和其他资源。

©2024 The Qt Company Ltd。所包含的文档贡献均为各自所有者的版权。本提供的文档受 GNU 自由文档许可证版本 1.3 的条款许可,由自由软件基金会发布。Qt 及相关标志是 The Qt Company Ltd 在芬兰和/或其他国家和地区的商标。所有其他商标均为各自所有者的财产。