QtCreator2.5.2插件系统裁剪(requiresQt4.7.4 orlater)
前言:一般的系统(非插件系统),在发布之后如果还需要修改,必须重新编译后发布。然而我们总有一些特殊的需求,要求已发布的系统能够动态的修改,而插件系统,可以很好的解决这个问题。实现插件系统首先要预先定义好系统的扩展接口,插件由其他开发人员根据系统预定的接口编写扩展功能。插件都是以一个独立文件的形式出现的。系统并不知道插件的具体功能,仅仅是为插件留下预定义的接口,系统启动的时候根据插件的配置寻找插件,根据预定的接口把插件挂接到系统中。Eclipse就算不是插件的鼻祖,应该也算是它将插件开发推向高潮吧。
具体细节可以参考一下文章:
- 软件的架构与设计模式http://soft.yesky.com/lesson/495/2012495.shtml
- 插件系统框架分析插件系统框架分析
- Eclipse平台架构技术分析及基于RCP的应用研究Eclipse平台架构技术分析及基于RCP的应用研究-UML软件工程组织-火龙果软件
- CodeProject上也能找到OSGI的C++实现
由于Qt是开源,接触过QtCreator的朋友应该也发现了QtCreator本身也是一套基于插件系统开发的软件,并且源码在手,让我们在此基础上将其裁剪,拿出精髓部分,打造一个干净清爽的可直接用于项目的插件系统。
1.基础介绍
1) Qmake是一个简化编译的工具,具体的介绍参考Qt帮助文档:
- Qt Wiki 搜索qmake或build之后可找到如下网址
- Category:Tools::qmake - Qt Wiki
- Qt Documentation | Home 搜索build可查看qmake、Qbs、CMake
- 也可以在Qt帮助文档中搜索qmake查看相关内容
2.具体的裁剪过程
1) 首先我选择QtCreator2.5.2这个版本,应该算是Qt4.x较晚的版本了,因为Qt在新版本中大量使用了QBS进行编译(Qbs Manual),因此先从简单的下手,这个版本我在Qt4.8.2下操作。下载后解压出源码,这里提点注意,因为我自己也经常忘记,Qt的项目不要放在中文目录,不要放在带空格的目录,如果非要区分多个单词,用’_’、‘-’等连接。
2) 第一层目录只保留src、qtcreator.pri、qtcreator.pro和tests(这个如果不想写单元测试也删除了吧)其他都删除。
- Qtcreator.pri修改其中的版本、名称等为自己的插件系统名称
下面粘贴部分修改内容:
- QtCreator.pro,修改文件名称、删除没用的
3) 修改src/app文件夹
- 只保留app.pro和main.cpp
- App.pro中没用的东西删除或者注释,很多都是平台相关的资源
- Main.cpp修改部分与QtCreator有关的路径变量等转为自定义的路径
4) 修改src/lib目录,只保留aggregation和extenstionsystem项目
- 其中引用的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目录只保留qtsingleapplication和qtlockedfile
7) Src/tools只保留tools.pro且清空里面内容
8) Src目录下的src.pro、QtCreatorlibrary.pri等修改文件中的一些变量和定义为自定义的名称即可
9) 编译通过之后运行程序如下:
至此已经完成插件系统的裁剪,在此基础上添加各种功能插件即可。