JFrame(扩展点和扩展实现机制)


我们将 mainwindow 分为几大部分(dock区域,actionToolBar,MenuBar、StatusBar,center),每一个部分我们都不直接在 MainWindow上实现,而是利用扩展点/扩展实现的机制,将某一个 action或者某一个status item 交给插件去实现,所以此 action 和对此 action 的实现的插件之间的关系是定义和实现的关系!

我们会首先定义和实现 actionToolBar 上的扩展点定义和实现

先来看看配置文件:

JFrame(扩展点和扩展实现机制)

 

 此配置文件指明了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 }

读取配置文件,建立扩展点和扩展实现之间的关系!

JFrame(扩展点和扩展实现机制)

 

原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/245224.html

(0)
上一篇 2022年4月18日
下一篇 2022年4月18日

相关推荐

发表回复

登录后才能评论