Qt Creator有個很風騷的外掛程式管理器PluginManager,還有個很騷包的外掛程式說明PluginSpec。基本上,所有的Qt程式的入口都是傳統的C程式一樣,代碼流程從main()函數開始。
在main()中,先初始化用於國際化的translator,然後擷取程式配置settings,接著就在棧上建立了PluginManager對象,之後為PluginManager設定搜尋用的副檔名pluginspec,設定配置,再設定外掛程式搜尋路徑。
設定好外掛程式搜尋路徑後,PluginManager會從配置中讀出被忽略的外掛程式列表和需要強制使能的外掛程式列表,然後開始在外掛程式搜尋路徑中尋找*.pluginspec檔案,這類檔案中記錄了外掛程式的名稱,版本號碼,依賴外掛程式等資訊。找出所有.pluginspec檔案後,就檢查一下每個外掛程式所依賴的外掛程式的名稱和版本號碼資訊是否匹配。
接著再返回main()中,找出Core外掛程式,該外掛程式是整個Qt Creator的主架構,甚至實現了主視窗。如果Core外掛程式有問題,Qt Creator就會列印出錯資訊後主動退出。
最後便是調用PluginManager::loadPlugins()載入所有外掛程式。loadPlugins()首先調用PluginManager::loadQueue()以確定外掛程式載入的先後順序,該過程做了兩件事,一是檢測是否存在循環相依性的情況,這裡用了一個很簡單的方法,將當前的外掛程式放入一個隊列中,然後檢測它所依賴的外掛程式的依賴外掛程式,如果新檢查的外掛程式所依賴的外掛程式在隊列中,那麼說明存在循環相依性。另一件事便是安排載入順序,同一個函數內通過遞迴,先遞推將最被依賴的外掛程式放入隊列,然後迴歸將最後的外掛程式放入隊列,這樣產生的便是解決了載入順序問題的隊列。得到載入順序的隊列後,便依次調用PluginSpec的loadPlugin()方法,這裡它將外掛程式狀態定義為Invalid、Read、Resolved、Loaded、Initialized、Running、Stopped、Deleted共8種,loadPlugin()方法根據傳入的要求的狀態,進行相應的操作。Loaded時通過Qt本身支援的外掛程式機制,裝入動態連結程式庫,之後是Initialized狀態,調用每個外掛程式的initializePlugin()方法,最後是Running狀態,調用每個外掛程式的initializeExtensions()方法。其中initializePlugin()和initializeExtensions()並沒有多少區別,調用的時機也是挨著的,中間沒有其他的操作。一般可以簡單地這樣區分,initializePlugin()中完成最最基本的外掛程式初始化工作,包括建立外掛程式內部的一些對象等,而initializeExtensions()中則完成那些內部對象的初始化工作。當然也可以不用嚴格遵守這種規則。
到此為止,整個Qt Creator就運行起來了,訊息迴圈啟動後,使用者就可以進行操作了。