ICode9

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

JFrame(组件的加载与退出【TestPlugin】)

2022-04-15 00:32:48  阅读:136  来源: 互联网

标签:IPluginInterface 插件 JFrame TestPlugin JCore QString virtual 加载


组件位置

 

组件暂时都被编译进 bin 目录,之后会进行区分!

组件配置文件

 

 该配置文件指示了哪些组件将要被加载以及加载顺序

 加载组件代码:

 1 bool JCore::loadPlugins(const QString &pluginsPath)
 2 {
 3     QFileInfoList fileList;
 4     QDir dir(pluginsPath);
 5 
 6     dir.setFilter(QDir::Files);
 7     fileList = dir.entryInfoList();
 8 
 9     foreach (QString pluginPath, m_config.getListAllPlugins())
10     {
11         if(_pluginExist(pluginPath, fileList))
12         {
13             qDebug() << "加载插件 [ " << pluginPath << " ] ... ";
14             if(!loadPlugin(pluginPath))
15             {
16                 qDebug() << "加载插件 [ " << pluginPath << " ] 失败!";
17                 break;
18             }
19             else
20             {
21                 qDebug() << "加载插件 [ " << pluginPath << " ] 成功!";
22             }
23         }
24         else
25         {
26             qDebug() << "插件 [ " << pluginPath << " ] 不存在!";
27         }
28     }
29     return true;
30 }
 1 bool JCore::loadPlugin(const QString &pluginPath)
 2 {
 3     IPluginInterface *p_plugin = nullptr;
 4     QPluginLoader* p_pluginLoader = nullptr;
 5     QObject *p_instance = nullptr;
 6 
 7     try
 8     {
 9         p_pluginLoader = new QPluginLoader(pluginPath);
10         p_instance = p_pluginLoader->instance();
11 
12     }
13     catch(...)
14     {
15         return false;
16     }
17 
18     p_plugin = qobject_cast<IPluginInterface*>(p_instance);
19     p_plugin->initialize();
20 
21     std::shared_ptr<PluginInfo> _pluginInfo(new PluginInfo);
22     _pluginInfo->m_name = p_plugin->getPluginNmae();
23     _pluginInfo->m_fullPath = pluginPath;
24     _pluginInfo->m_pInstance = std::shared_ptr<IPluginInterface>(p_plugin);
25 
26     m_listPluginInfo.append(_pluginInfo);
27 
28     return true;
29 }

插件接口文件

 1 class IPluginInterface
 2 {
 3 public:
 4     virtual ~IPluginInterface(){}
 5 
 6     // 插件初始化
 7     virtual void initialize() = 0;
 8 
 9     // 获取插件的名字
10     virtual QString getPluginNmae() = 0;
11 
12     // 插件退出时候调用的函数
13     virtual int exit() = 0;
14 };

JCore启动入口函数

 1 JCore::StartUPStatus JCore::startUP(const QString &appPath)
 2 {
 3     if(!m_config.readAllPlugins(appPath))
 4     {
 5         qDebug() << "读取插件路径失败!";
 6         return StartUPStatus::CONFIG_READ_ERROR;
 7     }
 8 
 9     if(!loadPlugins(appPath))
10     {
11         qDebug() << "实例化插件失败!";
12         return StartUPStatus::PLUGIN_LOAD_ERROR;
13     }
14 
15     return StartUPStatus::OK;
16 }
 1 MainWindow::MainWindow(QWidget *parent) :
 2     QMainWindow(parent),
 3     ui(new Ui::MainWindow)
 4 {
 5     ui->setupUi(this);
 6     m_coreInstance = JCore::getInstance();
 7     if(JCore::StartUPStatus::OK != m_coreInstance->startUP(QCoreApplication::applicationDirPath() + "/"))
 8     {
 9         qDebug() << "框架启动失败!";
10     }
11 }

TestPlugin 插件

 1 #ifndef TESTPLUGIN_H
 2 #define TESTPLUGIN_H
 3 
 4 #include "testplugin_global.h"
 5 #include "IPluginInterface.h"
 6 
 7 class TESTPLUGINSHARED_EXPORT TestPlugin : public QObject, public IPluginInterface
 8 {
 9     Q_OBJECT
10     Q_PLUGIN_METADATA(IID Plugin_interface_iid FILE "QPlugin.json")
11     Q_INTERFACES(IPluginInterface)
12 public:
13     TestPlugin(QObject *parent = nullptr);
14 
15     virtual ~TestPlugin() override;
16 
17     // 插件初始化
18     virtual void initialize() override;
19 
20     // 获取插件的名字
21     virtual QString getPluginNmae() override;
22 
23     virtual int exit() override;
24 };
25 
26 #endif // TESTPLUGIN_H
 1 #include "testplugin.h"
 2 #include <QDebug>
 3 
 4 TestPlugin::TestPlugin(QObject *parent)
 5     : QObject(parent)
 6 {
 7 }
 8 
 9 TestPlugin::~TestPlugin()
10 {
11     qDebug() << "~TestPlugin ...";
12 }
13 
14 void TestPlugin::initialize()
15 {
16     qDebug() << "TestPlugin begin initialize ...";
17 }
18 
19 QString TestPlugin::getPluginNmae()
20 {
21     return "TestPlugin";
22 }
23 
24 int TestPlugin::exit()
25 {
26     qDebug() << "TestPlugin exit ...";
27     return 0;
28 }

测试

 

标签:IPluginInterface,插件,JFrame,TestPlugin,JCore,QString,virtual,加载
来源: https://www.cnblogs.com/JackZheng/p/16147229.html

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

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

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

ICode9版权所有