ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-17 09:32:11  阅读:179  来源: 互联网

标签:插件 JFrame 配置文件 实现 扩展 action 机制 include


我们将 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 }

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

 

标签:插件,JFrame,配置文件,实现,扩展,action,机制,include
来源: https://www.cnblogs.com/JackZheng/p/16154998.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有