我们将 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/tech/pnotes/245224.html