我们将 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 }
读取配置文件,建立扩展点和扩展实现之间的关系!
原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/245224.html