【Qt】通过QtCreator源码学习Qt(七):插件管理类简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010168781/article/details/84842802

一、名字空间:ExtensionSystem

ExtensionSystem命名空间提供了属于核心插件系统的类。
ExtensionSystem包含插件管理器及其支持类,以及必须由插件提供者实现的IPlugin接口。

二、ExtensionSystem::PluginManager:插件主类

ExtensionSystem::PluginManager简介

三、ExtensionSystem::PluginView

ExtensionSystem::PluginView:浏览插件列表,点击QtCreator中–>帮助–>关于插件后弹出的管理插件的对话框。

四、ExtensionSystem::PluginErrorView

ExtensionSystem::PluginErrorView:管理插件的对话框中,选中一个插件,点击“错误详情”后显示插件状态和错误信息的窗口。

五、ExtensionSystem::PluginDetailsView

ExtensionSystem::PluginDetailsView:管理插件的对话框中,选中一个插件,点击"详情"显示插件内容(本版信息、描述、许可、依赖等信息)
ExtensionSystem::PluginErrorOverview:插件加载完毕后,如果加载时有错,弹出该窗口,显示错误信息

六、ExtensionSystem::Invoker

ExtensionSystem::Invoker:调用者,反射(待补充)

七、ExtensionSystem::IPlugin

ExtensionSystem::IPlugin:所有插件的基类,IPlugin类是一个抽象类,每个插件都需要实现一次。插件由两部分组成:描述文件和至少包含IPlugin实现的库。

1、插件规范:

插件需要在实际的插件库之外提供一个插件规范文件,这样插件管理器就可以找到插件,解决它的依赖关系,并加载它。

2、插件实现

插件必须在与XML描述中给出的name属性匹配的库中提供IPlugin类的一个实现。IPlugin实现必须导出,并让Qt的插件系统知道,使用Q_PLUGIN_METADATA宏,IID设置为“org.qt-project.Qt.QtCreatorPlugin”。

3、插件加载

读取插件的XML文件并找到依赖项后,插件加载工作分三个阶段完成:initialize、extensionsInitialized、delayedInitialize
插件加载顺序: 所有插件库按依赖树的{root-to-leaf}顺序加载。 按顺序加载能够解决插件之间的依赖问题,如果是弱依赖关系,可以将它们放入全局对象池。 如果库加载或初始化插件失败,所有依赖该插件的插件也会失败。

4、主要成员函数:
1)bool IPlugin::initialize(const QStringList &arguments, QString *errorString)

在加载插件并创建IPlugin实例之后调用。依赖于该插件的其它插件在该函数调用之后再加载。如果初始化成功返回。 如果没有成功,errorString应该设置为用户可读的消息,描述原因。

2)void IPlugin::extensionsInitialized()

延期初始化,在IPlugin::initialize()函数被调用之后调用,并且在 依赖于该插件的其它插件的IPlugin::initialize()和IPlugin::extensionsInitialized()之后调用。
在这个函数中,可以假设依赖于该插件的其它插件已经完全“启动并运行”。它是在全局对象池中查找弱依赖插件提供的对象的好地方。

3)bool IPlugin::delayedInitialize()

延时初始化,在全部插件执行IPlugin::extensionsInitialized()之后调用,并且在 依赖于该插件的其它插件的delayedInitialize()之后调用。
插件的delayedInitialize()函数是在应用程序已经运行之后调用的,从应用程序启动到单个delayedInitialize函数调用之间有几毫秒的延迟。
为了避免不必要的延迟,如果插件确实实现了它,那么它应该从函数中返回true,这表明下一个插件的delayedInitialize()调用应该延迟几毫秒,以便给输入和绘制事件一个处理的机会。
如果插件需要做一些不需要在启动时直接完成,但仍然需要在启动后短时间内完成的重要设置,那么可以使用这个函数。这可以大大减少插件/应用程序的启动时间。

4)IPlugin::ShutdownFlag IPlugin::aboutToShutdown()

在关闭序列期间调用,其顺序与初始化的顺序相同,然后按相反顺序删除插件。 这个函数应该用来断开与其他插件的连接,隐藏所有UI,并优化关闭。
如果一个插件需要延迟关闭,例如,如果它需要等待外部进程完成一个干净的关闭,插件可以从这个函数返回IPlugin::AsynchronousShutdown。
这将使主事件循环在aboutToShutdown()序列完成后继续运行,直到所有请求AsynchronousShutdown的插件都发送了asynchronousShutdownFinished()信号。
默认情况下,这个函数什么也不做,并返回IPlugin:: synchroniousshutdown。
如果插件需要在执行关闭之前执行异步操作,则返回IPlugin::AsynchronousShutdown。

5)QObject *IPlugin::remoteCommand(const QStringList &options, const QStringList &arguments)

如果一个QtCreator已经运行,再运行一个QtCreator -client时,这个函数将会在已经运行的QtCreator中调用

6)void IPlugin::asynchronousShutdownFinished()

异步关闭后由插件实现发送,表示准备继续执行关闭序列。

八、ExtensionSystem::PluginSpec:插件规范

PluginSpec类包含插件的嵌入元数据和关于插件当前状态的信息。
在插件加载过程中,如果发生错误,插件规范是查找错误细节的地方。
ExtensionSystem::PluginSpec::State表示插件在加载时所经历的状态。在发生错误的情况下,会给出错误的提示。
Invalid:插件还没有被读取;
Read:插件元数据已被成功读取,其信息可通过PluginSpec获得。
Resolved:描述文件中给出的依赖项已经成功找到,并且可以通过dependencySpecs()函数获得。
Loaded:加载插件库并创建插件实例
Initialized:已调用插件实例的IPlugin::initialize()函数,并返回一个成功值。
Running:所依赖插件的initialized和extensionsInitialized调用成功,加载过程完成。
Stopped:关闭插件,即已经调用了插件的IPlugin::aboutToShutdown()函数。
Deleted:插件实例已被删除。

九、ExtensionSystem::PluginDependency

PluginDependency类包含插件所依赖项的名字和版本。
版本的兼容性 <= 依赖版本 <= 插件版本??
成员变量:
ExtensionSystem::PluginDependency::name:依赖插件的名字
variable ExtensionSystem::PluginDependency::version:依赖插件的版本
ExtensionSystem::PluginDependency::type:依赖插件的是必需的还是可选的。
enum ExtensionSystem::PluginDependency::Type

Required:必需的
Optional:可选的,如果没有这个依赖的插件,也能运行
Test:需要强制加载依赖项以运行插件测试  

十、OptionsParser:参数解析类

(待完善)

猜你喜欢

转载自blog.csdn.net/u010168781/article/details/84842802