其他分享
首页 > 其他分享> > JFrame(改进扩展点和扩展实现)

JFrame(改进扩展点和扩展实现)

作者:互联网

首先看看配置文件的改动:

{     "Extension": [         {             "ExtensionPoint": {                 "pointName": "Logger",                 "pointIcon": "./images/plane.png"             },             "ExtensionImpl": {                 "pluginName": "JLogger",                 "widgetName": "LoggerPanel"             }         },         {             "ExtensionPoint": {                 "pointName": "Test",                 "pointIcon": "./images/config.png"             },             "ExtensionImpl": {                 "pluginName": "TestPlugin",                 "widgetName": "Widget"             }         }     ] }
配置文件中,加入了 widgetName ,这样的话具体到了一个扩展点的实现是由具体的一个插件里面的widget!   同样很大的改动是扩展实现的逻辑是由 ActionManager 来实现,而不是由负责扩展点实现的插件来负担!
 1 void ActionManager::slotTriggered(QString _aName)
 2 {
 3     auto _it = m_actionExtensionMap.begin();
 4     for(;_it!= m_actionExtensionMap.end(); _it++)
 5     {
 6         if(_it->first.pointName == _aName)
 7         {
 8             break;
 9         }
10     }
11 
12     std::shared_ptr<QWidget> _widget;
13     if(_it == m_actionExtensionMap.end())
14     {
15         return;
16     }
17     _widget = _it->second.widget;
18 
19     if(_widget.get())
20     {
21         if(m_mainWindow->centralWidget() != _widget.get())
22         {
23             JLogger::INFO(QString("[ %1 ] 窗体被加入到 centeralWidget!").arg(_widget->objectName()));
24             m_mainWindow->takeCentralWidget();
25             m_mainWindow->setCentralWidget(_widget.get());
26         }
27     }
28 }

ActionManager.h

 1 #ifndef ACTIONMANAGER_H
 2 #define ACTIONMANAGER_H
 3 
 4 #include <QObject>
 5 #include <QList>
 6 #include <QToolBar>
 7 #include <map>
 8 
 9 #include "../JCore/jcore.h"
10 #include "jaction.h"
11 #include "IPluginInterface.h"
12 #include "jlogger.h"
13 
14 class MainWindow;
15 
16 // 扩展点结构体
17 struct ActionExtensionPoint
18 {
19     ActionExtensionPoint()
20     {
21         pointName = "";
22         pointIcon = "";
23     }
24     QString pointName;
25     QString pointIcon;
26     bool operator< (const ActionExtensionPoint &_b) const
27     {
28         return pointName < _b.pointName;
29     }
30     bool operator== (const ActionExtensionPoint &_b) const
31     {
32         return pointName == _b.pointName;
33     }
34 };
35 
36 // 扩展实现结构体
37 struct ActionExtensionImpl
38 {
39     ActionExtensionImpl()
40     {
41         pluginName = "";
42         widgetName = "";
43     }
44     QString pluginName;
45     QString widgetName;
46 
47     std::shared_ptr<IPluginInterface> plugin;
48     std::shared_ptr<QWidget> widget;
49 };
50 
51 class ActionManager : public QObject
52 {
53     Q_OBJECT
54 public:
55     explicit ActionManager(QObject *parent = nullptr);
56 
57     void initialize(MainWindow *_mainWindow, QToolBar *_mainToolBar);
58 
59 private:
60     void parseExtension();
61     void constructActions();
62 
63 private slots:
64     void slotTriggered(QString _aName);
65 
66 private:
67 
68     // 扩展点、扩展实现信息存放map
69     std::map<ActionExtensionPoint, ActionExtensionImpl> m_actionExtensionMap;
70 
71     // 中央视图对应的 actions
72     QList<JAction*> m_centerViewActions;
73 
74     MainWindow *m_mainWindow = nullptr;
75 };
76 
77 #endif // ACTIONMANAGER_H
1 void TestPlugin::initWidgets()
2 {
3     m_widget = new Widget;
4     m_widget->setObjectName("Widget");
5     m_widgetList.append(std::shared_ptr<QWidget>(m_widget));
6 

 

标签:widget,JFrame,void,扩展,改进,QString,include,pointName
来源: https://www.cnblogs.com/JackZheng/p/16155448.html