C++实现自己的插件框架 基于QtCreator源码裁剪

QtCreator2.5.2插件系统裁剪(requiresQt4.7.4 orlater

前言:一般的系统(非插件系统),在发布之后如果还需要修改,必须重新编译后发布。然而我们总有一些特殊的需求,要求已发布的系统能够动态的修改,而插件系统,可以很好的解决这个问题。实现插件系统首先要预先定义好系统的扩展接口,插件由其他开发人员根据系统预定的接口编写扩展功能。插件都是以一个独立文件的形式出现的。系统并不知道插件的具体功能,仅仅是为插件留下预定义的接口,系统启动的时候根据插件的配置寻找插件,根据预定的接口把插件挂接到系统中。Eclipse就算不是插件的鼻祖,应该也算是它将插件开发推向高潮吧。

具体细节可以参考一下文章:

  • 软件的架构与设计模式http://soft.yesky.com/lesson/495/2012495.shtml
  • 插件系统框架分析http://www.uml.org.cn/j2ee/20114121.asp
  • Eclipse平台架构技术分析及基于RCP的应用研究http://www.uml.org.cn/j2ee/200701243.asp
  • CodeProject上也能找到OSGI的C++实现

由于Qt是开源,接触过QtCreator的朋友应该也发现了QtCreator本身也是一套基于插件系统开发的软件,并且源码在手,让我们在此基础上将其裁剪,拿出精髓部分,打造一个干净清爽的可直接用于项目的插件系统。

1.基础介绍

1)     Qmake是一个简化编译的工具,具体的介绍参考Qt帮助文档:

  • http://wiki.qt.io/Main_Page 搜索qmake或build之后可找到如下网址
  • http://wiki.qt.io/Category:Tools::qmake        
  • http://doc.qt.io/        搜索build可查看qmake、Qbs、CMake
  • 也可以在Qt帮助文档中搜索qmake查看相关内容

2.具体的裁剪过程

1)     首先我选择QtCreator2.5.2这个版本,应该算是Qt4.x较晚的版本了,因为Qt在新版本中大量使用了QBS进行编译(http://doc.qt.io/qbs/index.html),因此先从简单的下手,这个版本我在Qt4.8.2下操作。下载后解压出源码,这里提点注意,因为我自己也经常忘记,Qt的项目不要放在中文目录,不要放在带空格的目录,如果非要区分多个单词,用’_’、‘-’等连接。

2)     第一层目录只保留srcqtcreator.priqtcreator.protests(这个如果不想写单元测试也删除了吧)其他都删除。

  • Qtcreator.pri修改其中的版本、名称等为自己的插件系统名称

下面粘贴部分修改内容:

  • QtCreator.pro,修改文件名称、删除没用的

3)     修改src/app文件夹

  • 只保留app.pro和main.cpp
  • App.pro中没用的东西删除或者注释,很多都是平台相关的资源
  • Main.cpp修改部分与QtCreator有关的路径变量等转为自定义的路径

 



4)     修改src/lib目录,只保留aggregationextenstionsystem项目

  • 其中引用的pri等相关文件的名称修改为自定义的名称
  • 修改Src/Plugin目录,此目录中可全部删除,添加自己实现的插件

这里实现一个主程序窗口插件,以下为部分代码:

.h
classCoreGuiPlugin:publicExtensionSystem::IPlugin
{
        Q_OBJECT
public:
        CoreGuiPlugin();
    boolinitialize(constQStringList&arguments,QString*errorString);
        voidextensionsInitialized();
};
 
.cpp
boolCoreGuiPlugin::initialize(constQStringList&arguments,QString*errorString)
{
    Q_UNUSED(arguments);
    if(!ADLCoreGui::instance())
        errorString->append("ADLCoreGui'sinstance()failed!\n");
    ADLCoreGui::instance()->init();
    returntrue;
}
voidCoreGuiPlugin::extensionsInitialized()
{
    ADLCoreGui::instance()->getMainWindow()->show();
    return;
}

5)     删除src/share目录

6)     Src/shared目录只保留qtsingleapplicationqtlockedfile

7)     Src/tools只保留tools.pro且清空里面内容

8)     Src目录下的src.proQtCreatorlibrary.pri等修改文件中的一些变量和定义为自定义的名称即可

9)     编译通过之后运行程序如下:

至此已经完成插件系统的裁剪,在此基础上添加各种功能插件即可。


你可能感兴趣的:(Qt,设计模式,C++)