qt manual 已經專門介紹了deploying plugins 的問題。半年前qt 外掛程式學習(一) 也簡單整理了一點路徑相關的問題。
表面的答案:
$qtdir/plugins/imageformats/對於外掛程式來說,d->suffix 就是/imageformats ,這是通過乙個返回值為qfactoryloader* 的靜態 loader() 函式來實現的:注:如果你只是想讓外掛程式能工作,對其他不感興趣,直接在你的應用程式所在目錄下建立乙個 imageformats 目錄,把外掛程式放進去就行了。其他外掛程式類推,分別建立相應的子目錄即可。
對於外掛程式,程式遍歷這個字串列表,將每乙個字串分別和/imageformats 連線後構成新的路徑,然後依次嘗試載入這些路徑下的動態庫。
看點**(有刪節)
void qfactoryloader::update()
}...
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";"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;
:/qt/etc/qt.conf
不存在則檢查應用程式所在路徑下有無 qt.conf 檔案
找到則返回相應的qsettings,否則返回0
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 外掛程式學習 一 也簡單整理了一點路徑相關的問題。可是,一直以來沒理清 外掛程式 編譯碼外掛程式 資料庫外掛程式.到底是如何被載入的?如果我們需要開啟或儲存乙個jpg格式的,那麼需要載入jpg的外掛程式。程式去...
Qt學習筆記 19 工程外掛程式
這個星期,主要的工作內容在乙個較為大型的工程上面加上我寫的外掛程式。同時,將其執行起來,下面,我將寫一下整個流程。根據廠家給的第三方庫,我們要呼叫它的庫才能寫出對應他們板子的外掛程式。這個第三方庫主要包含三大部分的內容。h,dll,lib檔案。有可能還有其他的一些支援檔案,比如裡面的這個2020年8...
Qt 外掛程式系統
qt 有兩種與外掛程式有關的 api。一種用來擴充套件 qt本身的功能,如 自定義資料庫驅動 影象格式 文字編譯碼等,稱為 higher level ap 既高階介面。另一種用於應用程式的功能擴充套件,稱為 lower level api 低階介面。前一種是建立在後一種的基礎之上的。前一種是擴充套件...