Plugin Life Cycle

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

启动Qt Creator前,设置环境变量QT_LOGGING_RULES为qtc.extensionsystem*=true,可以使能插件相关的调试日志输出,启动后,你就可以获取有关情况的更多信息。

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

  1. 在其搜索路径中查找所有动态库,并读取库元数据。所有没有元数据和IID不是org.qt-project.Qt.QtCreatorPlugin的库都将被忽略。这是加载插件可能失败的第一处地方,在最坏的元数据格式错误的情况下。

  2. 为每个插件创建ExtensionSystem::PluginSpec类的实例。此类是一个容器,包含来自插件规范的所有信息,并且还跟踪插件的状态。您可以通过插件管理器的plugins()函数,或者在插件被加载后,通过插件的pluginSpec()函数,来获取ExtensionSystem::PluginSpec实例。

  3. 将插件设置为Read状态。

  4. 验证插件的每个依赖项是否存在并且兼容。有关插件依赖性的更多信息,请参见Plugin Meta Data

  5. 将插件设置为Resolved状态。

  6. 将所有插件排序到列表,我们称为加载队列,队列中,插件的依赖插件位于插件之后(但不一定直接紧靠在插件之后)。这将确保我们以正确的顺序加载和初始化插件。

  7. 加载插件库,并按照加载队列的顺序创建对应的IPlugin实例。此时,将调用插件的构造函数。被其他插件所依赖的插件先创建。

  8. 将插件设置为Loaded状态。

  9. 按照加载队列的顺序调用各个插件的initialize()函数。在初始化函数中,插件应确保所有的导出接口均已设置,并可供其他插件使用。插件可以假定他们所依赖的插件的导出接口均已设置好了。例如,Core插件设置了Core::ActionManager,Core::EditorManager和所有其他公有可用接口,因此其他插件可以请求和使用它们。

    插件的initialize()函数对于下面来说是一个好地方:

  10. 将插件设置为Initialized状态。

  11. 以加载队列的相反顺序调用所有插件的extensionsInitialized()函数。在extensionsInitialized函数之后,插件应该彻底完成初始化,设置和运行。插件可以假定依赖于它的插件也已彻底完成设置,并且可以完成初始化部分,供其他插件扩展。例如,Core插件可以假定所有插件均已注册其动作,并完成动作管理器的初始化。
  12. 将插件设置为Running状态。

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

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

在完成所有延迟的初始化之后,PluginManager将发送initializeDone()信号。

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

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

原创造福大家,共享改变世界

献出一片爱心,温暖作者心灵


qt creator源码全方面分析(2-10-4)的更多相关文章

  1. qt creator源码全方面分析(3-3)

    目录 qtcreatordata.pri 定义stripStaticBase替换函数 设置自定义编译和安装 QMAKE_EXTRA_COMPILERS Adding Compilers 示例1 示例2 ...

  2. qt creator源码全方面分析(3-5)

    目录 qtcreatorlibrary.pri 使用实例 上半部 下半部 结果 qtcreatorlibrary.pri 上一章节,我们介绍了src.pro,这里乘此机会,把src目录下的所有项目文件 ...

  3. qt creator源码全方面分析(0)

    本人主攻C++和Qt. 上两天刚研究完Qt install framework(IFW)应用程序安装框架. google没发现有正儿八经的官方文档的翻译,我就进行了翻译哈!! 系列文章具体见:http ...

  4. qt creator源码全方面分析(4-0)

    Qt系统 Qt Creator源码是在Qt对象和框架基础下写的,因此,阅读Qt Creator源码,你首先对Qt得有一定的了解. Qt Core Qt Core特征: The Meta-Object ...

  5. qt creator源码全方面分析(4-2)

    目录 global头文件 global.h xx.h global头文件 插件的本质就是动态链接库,对于库,需要导出符号,供用户导入使用.在qt creator的源码中,存在固定的导入导出模式. gl ...

  6. qt creator源码全方面分析(4-5)

    目录 Qt中的字符串 QLatinString 详细介绍 源码 小结 QStringLiteral(str) 详细介绍 源码 小结 Qt中的字符串 Qt中处理字符串最常用的肯定是QString,但是在 ...

  7. qt creator源码全方面分析(4-6)

    目录 Qt插件基础 Qt插件基础 我们知道Qt Creator源码是基于插件架构的,那么我们先来介绍下插件基础知识. 相关内容如下: How to Create Qt Plugins [ - Defi ...

  8. qt creator源码全方面分析(3-2)

    目录 qtcreator.pri 判断重复包含 定义版本信息 VERSION 定义IDE名称 启用C++14 CONFIG 自定义函数 Replace Functions Test Functions ...

  9. qt creator源码全方面分析(2-7)

    目录 Completing Code 补全代码片段 编辑代码片段 添加和编辑片段 删除片段 重置片段 补全Nim代码 Completing Code 在编写代码时,Qt Creator建议使用属性,I ...

  10. qt creator源码全方面分析(2-10-1)

    目录 Getting and Building Qt Creator 获取Qt 获取和构建Qt Creator Getting and Building Qt Creator 待办事项:应该对此进行扩 ...

随机推荐

  1. 通过例子进阶学习C++(四)计算2的64次方,不服写写看

    ​ 本文是通过例子学习C++的第四篇,通过这个例子可以快速入门c++相关的语法. 1.乍一看题目非常简单,简单思考一下,可以通过for循环实现: #include <iostream> u ...

  2. 有哪些让人相见恨晚的Python库(一)

    对于我这个经常用python倒腾数据的人来说,下面这个库是真·相见恨晚 记得有一次我在服务器上处理数据时,为了解决Pandas读取超过2000W条数据就内存爆炸的问题,整整用了两天时间来优化.最后通过 ...

  3. 256位AES加密和解密

    /// <summary> /// 256位AES加密 /// </summary> /// <param name="toEncrypt">& ...

  4. 每天玩转3分钟 MyBatis-Plus - 1. 配置环境

    每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 ...

  5. UidGenerator springboot2集成篇

    uid-generator 官网集成文档: https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md 由于并没有提供spri ...

  6. 使用eNSP配置QinQ

    参考链接:https://blog.csdn.net/alone_map/article/details/52217094 本文主要记录使用华为eNSP模拟器来实现配置QinQ,并对QinQ的报文进行 ...

  7. Windows10 java环境配置

    1.下载 JDK 下载地址:https ://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 点击下载按钮 ...

  8. 发现 一个业务管理系统 解决了 orm 和 前端框架 剩下的 是 业务逻辑 了 。 哈

    解决了 orm 和 前端框架 剩下的 是 业务逻辑 了 . 哈 还有 各种 aop 组件 呢 . 大家 high 来 准备 用 fluent data  和 mysql 写一个 wcf 的 接口呢. ...

  9. AVL练习题——宠物收养所

    题目描述 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出 ...

  10. 改进Zhang Suen细化算法的C#实现

    本文主要实现了改进Zhang Suen细化算法的C#实现,相关论文 :“牟少敏,杜海洋,苏平,查绪恒,陈光艺.一种改进的快速并行细化算法[J].微电子学与计算机,2013,(第1期)” .这篇论文中关 ...