Qt 外掛程式路徑 筆記

2021-08-25 21:38:30 字數 3562 閱讀 9588

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

表面的答案:

$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")))

嘗試用事實說話...

原始碼: 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_plugpath=e://qt5//qtbase-build//plugins";

:/qt/etc/qt.conf

不存在則檢查應用程式所在路徑下有無 qt.conf 檔案

找到則返回相應的qsettings,否則返回0

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 外掛程式學習 一 也簡單整理了一點路徑相關的問題。可是,一直以來沒理清 外掛程式 編譯碼外掛程式 資料庫外掛程式.到底是如何被載入的?如果我們需要開啟或儲存乙個jpg格式的,那麼需要載入jpg的外掛程式。程式去...

Qt學習筆記 19 工程外掛程式

這個星期,主要的工作內容在乙個較為大型的工程上面加上我寫的外掛程式。同時,將其執行起來,下面,我將寫一下整個流程。根據廠家給的第三方庫,我們要呼叫它的庫才能寫出對應他們板子的外掛程式。這個第三方庫主要包含三大部分的內容。h,dll,lib檔案。有可能還有其他的一些支援檔案,比如裡面的這個2020年8...

Qt 外掛程式系統

qt 有兩種與外掛程式有關的 api。一種用來擴充套件 qt本身的功能,如 自定義資料庫驅動 影象格式 文字編譯碼等,稱為 higher level ap 既高階介面。另一種用於應用程式的功能擴充套件,稱為 lower level api 低階介面。前一種是建立在後一種的基礎之上的。前一種是擴充套件...