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