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
