qt creator源码全方面分析(2-10-5)
The Plugin Manager, the Object Pool, and Registered Objects
通常,插件不需要直接访问插件管理器。 交互主要间接的通过ExtensionSystem::IPlugin接口。 在某些情况下,则必须使用插件管理器API。 插件需要访问插件管理器的对象池,以扩展Qt Creator的某些方面,例如将页面添加到选项对话框。 他们还可以利用对象池为其他插件提供扩展点。
插件管理器
插件管理器处理所有细节,包括查找插件,读取它们的描述文件,解决插件依赖性,以正确的顺序加载和初始化所有插件,以及传递命令行参数给插件。
另外,插件管理器管理对象池,可以根据不同的条件在其中注册和检索对象。
插件与插件管理器的大多数交互应通过ExtensionSystem::IPlugin接口完成,但是下表总结了一些对插件有用的函数和信号。 有关完整列表,请参见ExtensionSystem::PluginManager参考文档。
函数 | 描述 |
---|---|
instance() | 返回插件管理器单例,例如,用于连接信号。 |
addObject() | 在对象池中注册对象。 也可以通过ExtensionSystem::IPlugin::addObject()。 |
removeObject() | 从对象池中移除对象。 也可以通过ExtensionSystem::IPlugin::removeObject()。 |
allObjects() | 返回对象池中注册的所有对象的未过滤列表。 |
getObject |
返回注册在对象池中的类型为T的对象。 这在向Aggregation致敬。 |
getObjectByName(const QString &name) | 返回在对象池中注册的具有给定对象名称的对象。 |
信号 | 描述 |
---|---|
objectAdded(QObject *object) | 在对象被注册到对象池之后发送。 |
aboutToRemoveObject(QObject *object) | 在对象从对象池中移除之前发送。 |
initializationDone() | 在插件运行,且所有延迟的初始化完成时发送。 |
对象池和已注册对象
插件可以将对象注册到由插件管理器管理的公共池中。池中的对象必须派生自QObject,无需其他先决条件。
所有指定类型的对象,可以通过getObject()函数从对象池中检索。函数感知Aggregation::Aggregate,并使用Aggregation::query()函数,而不是qobject_cast来判断匹配对象。
可以通过allObjects()函数,检索在对象池中注册的所有对象的未过滤列表。
也可以使用getObjectByName(),检索具有特定对象名称的对象(参见QObject::objectName())。
每当对象池的状态更改时,插件管理器都会发出相应的objectAdded()
或 aboutToRemoveObject()
信号。
对象池的一个常见用例是,一个插件(或应用程序)为其他插件提供了扩展点,扩展点为类,在其他插件中实现,并添加到对象池中,然后供提供扩展点的插件检索。也可以使用对象池来提供对对象的访问,而无需实际链接到提供的插件库。
原创造福大家,共享改变世界
献出一片爱心,温暖作者心灵