目錄
- The Plugin Manager, the Object Pool, and Registered Objects
- 插件管理器
- 物件池和已注冊物件
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()信號,
物件池的一個常見用例是,一個插件(或應用程式)為其他插件提供了擴展點,擴展點為類,在其他插件中實作,并添加到物件池中,然后供提供擴展點的插件檢索,也可以使用物件池來提供對物件的訪問,而無需實際鏈接到提供的插件庫,
原創造福大家,共享改變世界
獻出一片愛心,溫暖作者心靈
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/14276.html
標籤:其他
