QtCreator源码分析—2.启动主程序

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槽对接

你可能感兴趣的:(Qt,C++)