找回密码
 立即注册
收起左侧

请教关于插件的概念

2
回复
332
查看
[复制链接]
累计签到:27 天
连续签到:1 天
来源: 2019-11-8 09:59:29 显示全部楼层 |阅读模式
1Qter豆
现在应用程序的模块比较多,了解到插件方式对应用程序的模块化管理比较方便。

看了一些例程,发现应用程序对插件的加载和通信都是通过类似“loadPlugin()”这样的方法实现的,这里的前提是:
1. 应用程序知道有这么个插件(扫描该插件并加载,然后连接信号槽)
2. 插件知道应用程序的相关接口(开发该插件的过程中知道应用程序的相关信号槽)
问题一:感觉这种方式跟普通的模块化编程(非插件化)性质差不多,请问一下插件方式有什么优势呢?

假如应用程序和插件一起发布了,在运行一段时间后发现需要增加一些功能,这时候再去开发对应的插件(新插件)的话,可能会有以下的情况:
1. 应用程序本省并没有新插件所需的信号
2. 把新插件的dll文件放在对应文件夹后,应用程序虽然扫描到了,但是不会做任何处理(如以下代码)
问题二:在这种情况下,是不是除了加载新插件外,应用程序也要一起修改呢?(修改loadPlugin()以实现对新插件的支持)

  1.     pluginsDir.cd("plugins");
  2.     foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
  3.             QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
  4.             QObject *plugin = pluginLoader.instance();
  5.             if (plugin) {
  6.                     echoInterface = qobject_cast<EchoInterface *>(plugin);
  7.                     if (echoInterface)
  8.                         return true;
  9.             }
  10.     }
复制代码
注:EchoInterfac是之前开发好的插件,如果新增插件(如HelloWorld)的话,这段代码是不是要添加对新插件的识别?


回复

使用道具 举报

累计签到:272 天
连续签到:1 天
2019-12-11 17:17:56 显示全部楼层
   这个例子只是Qt的一个demo,你可以跟据你的需求去设计这些插件,不要局限这个demo。还有插件间的通信方式并不仅限于信号与槽哦,多态,指针回调,socket。。等等是实现通信的手段。插件相对于普通模块化编程更加方便管理,比如说你可以再应用程序中自己选择是否加载模块,更加方便地实现功能化定制。
   第二个问题,原因在于你地插件管理器的设计。你如果想了解插件开发建议去看一看QtCreator的源码,QtCreator整个应用程序都是基于插件开发的
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2019-12-18 15:01:32 显示全部楼层
MarioZz 发表于 2019-12-11 17:17
这个例子只是Qt的一个demo,你可以跟据你的需求去设计这些插件,不要局限这个demo。还有插件间的通信方 ...

十分感谢您的回复,我会按您回复中出现的那些概念去学习一下!再次感谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册