qt manual 已經專門介紹了deploying plugins 的問題。半年前qt 外掛程式學習(一) 也簡單整理了一點路徑相關的問題。
可是,一直以來沒理清:外掛程式、編譯碼外掛程式、資料庫外掛程式... 到底是如何被載入的?
如果我們需要開啟或儲存乙個jpg格式的,那麼需要載入jpg的外掛程式。程式去何處找外掛程式:
表面的答案:
$qtdir/plugins/imageformats/對於外掛程式來說,d->suffix 就是/imageformats ,這是通過乙個返回值為qfactoryloader* 的靜態 loader() 函式來實現的:注:如果你只是想讓外掛程式能工作,對其他不感興趣,直接在你的應用程式所在目錄下建立乙個 imageformats 目錄,把外掛程式放進去就行了。其他外掛程式類推,分別建立相應的子目錄即可。
對於外掛程式,程式遍歷這個字串列表,將每乙個字串分別和/imageformats 連線後構成新的路徑,然後依次嘗試載入這些路徑下的動態庫。
看點**(有刪節)
void qfactoryloader::update()
}...
q_global_static_with_args(qfactoryloader, loader,前面似乎不對啊?不光和我們的表面答案對不上,而且manual中或其他人的文章都提到還有很多東西,比如:(qimageiohandle***ctoryinte***ce_iid, qlatin1string("/imageformats")))
嘗試用事實說話...
原始碼: const qbytearray libpathenv = qgetenv("qt_plugin_path");
if (!libpathenv.isempty()) }}
...現在似乎舒服多了,可是qlibraryinfo::location(qlibraryinfo::pluginspath) 又是怎麼來的呢?
它受兩方面影響:
先看後者:
編譯qt的第一步是configure,它將在 src/corelib/global目錄下生成 qconfig.h 和 qconfig.cpp 兩個檔案。
開啟 qconfig.cpp 檔案(可以看到類似下面的內容):
static const char qt_configure_installation [11 + 12] = "qt_instdate=2011-06-08";注意一點:巨集 qt_configure_plugins_path 指向 "qt_plugpath=e://qt5//qtbase-build//plugins";static const char qt_configure_prefix_path_str [512 + 12] = "qt_prfxpath=e://qt5//qtbase-build";
static const char qt_configure_binaries_path_str [512 + 12] = "qt_binspath=e://qt5//qtbase-build//bin";
static const char qt_configure_plugins_path_str [512 + 12] = "qt_plugpath=e://qt5//qtbase-build//plugins";
#define qt_configure_binaries_path qt_configure_binaries_path_str + 12;
#define qt_configure_plugins_path qt_configure_plugins_path_str + 12;
qsettings *qlibraryinfoprivate::findconfiguration()直接貼點**片段,不解釋}if (qfile::exists(qtconfig))
return new qsettings(qtconfig, qsettings::iniformat);
return 0;
}
qstring為了加快外掛程式的載入和校驗,會用qsettings儲存一些外掛程式的資訊。qlibraryinfo::location(librarylocation loc)
if (path)
ret = qstring::fromlocal8bit(path);
} else {
qstring key;
qstring defaultvalue;
switch(loc) {
case pluginspath:
key = qlatin1string("plugins");
defaultvalue = qlatin1string("plugins");
break;
...
看個**片段:
qfactoryloader::update()以及{ qsettings settings(qsettings::userscope, qlatin1string("trolltech"));
qstring regkey = qstring::fromlatin1("qt factory cache %1.%2/%3:/%4")
.arg((qt_version & 0xff0000) >> 16)
.arg((qt_version & 0xff00) >> 8)
.arg(qlatin1string(d->iid))
.arg(filename);
qstringlist reg;
reg << library->lastmodified;
reg += keys;
settings.setvalue(regkey, reg);
bool qlibraryprivate::isplugin(qsettings *settings)看看windows下的登錄檔內容:{...
qstring regkey = qstring::fromlatin1("qt plugin cache %1.%2.%3/%4")
.arg((qt_version & 0xff0000) >> 16)
.arg((qt_version & 0xff00) >> 8)
.arg(qlibrary_as_debug ? qlatin1string("debug") : qlatin1string("false"))
.arg(filename);
...
hkcu/software/trolltech/organizationdefaults/qt factory cache 4.7/com.trolltech.qt.qimageiohandle***ctoryinte***ce:/f:/qt4/plugins/imageformats/qtjpeg4.dll = 2010-09-29t14:40:30 jpeg jpglinux下 ~/.config/trolltech.conf
Qt 外掛程式路徑 筆記
qt manual 已經專門介紹了deploying plugins 的問題。半年前qt 外掛程式學習 一 也簡單整理了一點路徑相關的問題。表面的答案 qtdir plugins imageformats 注 如果你只是想讓外掛程式能工作,對其他不感興趣,直接在你的應用程式所在目錄下建立乙個 ima...
Qt 外掛程式系統
qt 有兩種與外掛程式有關的 api。一種用來擴充套件 qt本身的功能,如 自定義資料庫驅動 影象格式 文字編譯碼等,稱為 higher level ap 既高階介面。另一種用於應用程式的功能擴充套件,稱為 lower level api 低階介面。前一種是建立在後一種的基礎之上的。前一種是擴充套件...
Qt 外掛程式總結
1 介面的定義 step 1 定義介面 class regexpinte ce virtual qstring regexp const qstring message 0 step 2 宣告介面 使用 q declare inte ce 巨集,是為了讓qt元物件系統知道該介面,這樣以來,在執行時便...