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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM