Qt 外掛程式路徑

2021-06-28 11:52:52 字數 3681 閱讀 5729

qt manual 已經專門介紹了deploying plugins 的問題。半年前qt 外掛程式學習(一) 也簡單整理了一點路徑相關的問題。

可是,一直以來沒理清:外掛程式、編譯碼外掛程式、資料庫外掛程式... 到底是如何被載入的?

如果我們需要開啟或儲存乙個jpg格式的,那麼需要載入jpg的外掛程式。程式去何處找外掛程式:

表面的答案:

$qtdir/plugins/imageformats/

注:如果你只是想讓外掛程式能工作,對其他不感興趣,直接在你的應用程式所在目錄下建立乙個 imageformats 目錄,把外掛程式放進去就行了。其他外掛程式類推,分別建立相應的子目錄即可。

對於外掛程式,程式遍歷這個字串列表,將每乙個字串分別和/imageformats 連線後構成新的路徑,然後依次嘗試載入這些路徑下的動態庫。

看點**(有刪節)

void qfactoryloader::update()

}...

對於外掛程式來說,d->suffix 就是/imageformats ,這是通過乙個返回值為qfactoryloader* 的靜態 loader() 函式來實現的:

q_global_static_with_args(qfactoryloader, loader,

(qimageiohandle***ctoryinte***ce_iid, qlatin1string("/imageformats")))

前面似乎不對啊?不光和我們的表面答案對不上,而且manual中或其他人的文章都提到還有很多東西,比如:

嘗試用事實說話...

原始碼: 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";

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;

注意一點:巨集 qt_configure_plugins_path 指向  "qt_plugpath=e://qt5//qtbase-build//plugins";

qsettings *qlibraryinfoprivate::findconfiguration()

}if (qfile::exists(qtconfig))

return new qsettings(qtconfig, qsettings::iniformat);

return 0;

}

直接貼點**片段,不解釋

qstring

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;

...

為了加快外掛程式的載入和校驗,會用qsettings儲存一些外掛程式的資訊。

看個**片段:

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)

{...

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);

...

看看windows下的登錄檔內容:

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 jpg
linux下 ~/.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元物件系統知道該介面,這樣以來,在執行時便...