1. 程式人生 > 其它 >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