1. 程式人生 > 其它 >JFrame(擴充套件點和擴充套件實現機制)

JFrame(擴充套件點和擴充套件實現機制)

我們將 mainwindow 分為幾大部分(dock區域,actionToolBar,MenuBar、StatusBar,center),每一個部分我們都不直接在 MainWindow上實現,而是利用擴充套件點/擴充套件實現的機制,將某一個 action或者某一個status item 交給外掛去實現,所以此 action 和對此 action 的實現的外掛之間的關係是定義和實現的關係!

我們會首先定義和實現 actionToolBar 上的擴充套件點定義和實現

先來看看配置檔案:

 

 此配置檔案指明瞭actionToolBar 上包含哪些擴充套件點,並且這些擴充套件點由哪個對應的外掛實現,途中 TName 這個action是由JLogger 這個外掛來實現的!

目前這個配置檔案比較簡單!

實現:

 1 #include "actionmanager.h"
 2 #include <QFile>
 3 #include <QIODevice>
 4 #include <QJsonDocument>
 5 #include <QJsonParseError>
 6 #include <QJsonObject>
 7 #include <QJsonArray>
 8 #include <QDebug>
 9 #include <QDir>
10 #include <QIcon>
11
12 ActionManager::ActionManager(QObject *parent) : QObject(parent) 13 { 14 15 } 16 17 void ActionManager::initialize(QToolBar *_mainToolBar) 18 { 19 parseExtension(); 20 constructActions(); 21 foreach(auto _a, m_centerViewActions) 22 { 23 _mainToolBar->addAction(_a); 24
} 25 } 26 27 void ActionManager::parseExtension() 28 { 29 QFile file(QDir::currentPath() + "/config/action_extension.json"); 30 if(!file.open(QIODevice::ReadOnly)) 31 { 32 qDebug() << "讀取 extension.json 檔案失敗!"; 33 return; 34 } 35 QByteArray content = file.readAll(); 36 file.close(); 37 38 QJsonParseError pError; 39 QJsonDocument doc = QJsonDocument::fromJson(content, &pError); 40 if(pError.error != QJsonParseError::NoError) 41 { 42 qDebug() << "Json 解析失敗!"; 43 return; 44 } 45 QJsonObject jsonObj = doc.object(); 46 QJsonArray jsonArray = jsonObj.value("Extension").toArray(); 47 m_actionExtensionMap.clear(); 48 for(int i = 0; i < jsonArray.size(); i++) 49 { 50 QJsonObject obj = jsonArray.at(i).toObject(); 51 52 QJsonObject o = obj.value("ExtensionPoint").toObject(); 53 ActionExtensionPoint _point; 54 _point.actionName = obj.value("ExtensionPoint").toObject().value("actionName").toString(); 55 _point.actionIcon = obj.value("ExtensionPoint").toObject().value("actionIcon").toString(); 56 ActionExtensionImpl _impl; 57 _impl.pluginName = obj.value("ExtensionImpl").toObject().value("pluginName").toString(); 58 59 m_actionExtensionMap.insert({_point, _impl}); 60 } 61 } 62 63 void ActionManager::constructActions() 64 { 65 foreach(auto el, m_actionExtensionMap) 66 { 67 QAction *_action = new QAction; 68 _action->setText(el.first.actionName); 69 _action->setIcon(QIcon(el.first.actionIcon)); 70 JCore *pCore = JCore::getInstance(); 71 IPluginInterface * _plugin; 72 auto _pluginInfo = pCore->getPluginInfo(el.second.pluginName); 73 if(_pluginInfo.get()) 74 { 75 _plugin = _pluginInfo->m_pInstance.get(); 76 } 77 78 connect(_action, &QAction::triggered, _plugin, &IPluginInterface::actionExtensionImpl); 79 m_centerViewActions.append(_action); 80 } 81 }

讀取配置檔案,建立擴充套件點和擴充套件實現之間的關係!