QtCreator源码分析—2.启动主程序(4篇)
QtCreator采用插件体系结构。主程序启动插件管理器(PluginManager),再通过插件管理器加载其插件,QtCreator的所有功能均使用插件实现。
我们先来分析主程序对插件管理器的主要操作:
int main(int argc, char **argv) { ...... ExtensionSystem::PluginManager pluginManager;//生成插件管理器实例 pluginManager.setFileExtension(QLatin1String("pluginspec"));//设置插件配置文件类型,默认xml pluginManager.setPluginPaths(pluginPaths);//设置插件所在目录
......//对参数操作 //让插件管理器解析启动参数 if (!pluginManager.parseOptions(arguments, appOptions, &foundAppOptions, &errorMessage)){ } ...... //找到核心插件(由corePluginNameC定义其名字) const PluginSpecSet plugins = pluginManager.plugins(); ExtensionSystem::PluginSpec *coreplugin = 0; foreach (ExtensionSystem::PluginSpec *spec, plugins) { if (spec->name() == QLatin1String(corePluginNameC)) { coreplugin = spec; break; } } //对核心插件进行一些检查 ...... //载入插件 pluginManager.loadPlugins(); //一些错误处理 ...... if (isFirstInstance) { app.initialize(); //将主程序运行过程中得到的消息传递给核心插件 QObject::connect(&app, SIGNAL(messageReceived(QString)), coreplugin->plugin(), SLOT(remoteArgument(QString))); } //将主程序的打开文件请求消息传递给核心插件 QObject::connect(&app, SIGNAL(fileOpenRequest(QString)), coreplugin->plugin(), SLOT(remoteArgument(QString))); //建立消息循环 QTimer::singleShot(100, &pluginManager, SLOT(startTests())); return app.exec(); }
从上面的过程,可以看出一共对插件管理器做了5件事情,依次为
1、插件管理器先设置了一些环境变量,比如插件配置文件类型、所在目录等
2、将启动参数交给插件管理器解析
3、对核心插件(特定命名的插件)进行检查
4、加载插件
6、将主程序的消息和核心插件的remoteArgument槽对接
http://blog.csdn.net/superzhaifd/article/details/16114547