利用外掛程式擴充套件Qt應用程式

2021-09-20 11:41:11 字數 4087 閱讀 5113

不僅 qt 本身可以通過外掛程式進行擴充套件,而且 qt 應用程式也可以通過外掛程式來擴充套件,這需要應用程式使用qpluginloader檢測和載入外掛程式。在這種情況下,外掛程式可能提供任意功能,不限於資料庫驅動程式、影象格式、文字編解碼器、樣式以及擴充套件 qt 功能的其他型別的外掛程式。

原始碼位址

編寫擴充套件 qt 應用程式的外掛程式,涉及以下步驟:

通過外掛程式使應用程式可擴充套件,涉及以下步驟:

為我們的職業感到自豪,程式設計師可以創造世界。。。以此為例吧!

工程檔案 -.pro

和前面一樣,由於我們正在構建的是乙個共享庫,所以在.pro中,需要將template設定為 lib,同時還必須將config設定為 plugin。

plugin.pro內容如下:

qt += core

qt -= gui

template = lib

config += plugin

target = personplugin

headers += \

person.h \

programmer.h

sources += programmer.cpp

other_files += programmer.json

win32 else

這裡,將外掛程式生成在plugins目錄中,當然,目錄名可以隨便起。

介面類 -iperson

宣告了乙個關於人的介面類 -iperson,定義了外掛程式將提供的功能。

注意:介面是乙個僅由純虛函式組成的類,如果在類中存在非虛函式,那麼在 moc 檔案中會出現誤導的編譯錯誤。

person.h內容如下:

#ifndef person_h

#define person_h

#include

#include

class iperson

virtual qstring name() = 0; // 人有名字

virtual

void eat() = 0; // 人需要吃東西

virtual

void sleep() = 0; // 人需要睡覺

virtual

void dosomething() = 0; // 人還需要幹其他事

};#define iperson_iid "org.qt-project.qt.examples.iperson"

q_declare_inte***ce(iperson, iperson_iid)

#endif // person_h

使用q_declare_inte***ce巨集,是為了讓 qt 元物件系統知道該介面,這樣以來,在執行時便可以識別實現介面的外掛程式。其中,第二個引數(iperson_iid)是乙個標識介面的字串,必須唯一。

外掛程式類 - programmer

現在,是時候該程式設計師出場了。定義乙個programmer類,繼承自qobjectiperson,使這個類成為乙個外掛程式。

programmer.h內容如下:

#ifndef programmer_h

#define programmer_h

#include "person.h"

#include

class programmer : public qobject, iperson

;#endif // programmer_h

q_inte***ces巨集用於告訴 qt 該類實現的介面。q_plugin_metadata巨集包含外掛程式的iid,並指向乙個包含外掛程式元資料的 json 檔案。該 json 檔案會被編譯到外掛程式中,無需安裝。

程式設計師日常:吃飯、睡覺、擼**。。。(⊙o⊙)…

programmer.cpp內容如下:

#include

"programmer.h"

#include

qstring programmer::name()

void programmer::eat()

void programmer::sleep()

void programmer::dosomething()

外掛程式的元資料 - json 檔案

外掛程式已經基本完成,但貌似還缺些什麼?沒錯,元資料!外掛程式總需要提供一些相關的資訊吧!

這時上面提到的 json 檔案就相當有用了!可以包含一些元資料,例如:作者、日期、外掛程式名、版本號、依賴關係等。。。

programmer.json內容如下:

由於現在只有乙個外掛程式,並沒有對於其他外掛程式的依賴,所以暫時沒有列出依賴關係(要實現乙個外掛程式系統,依賴關係必不可少)。

注意:如果不想為外掛程式提供資訊,當然不會有任何問題,只需保證 json 檔案為空就行。

一切準備就緒,來實現乙個簡單的控制台應用程式,以動態載入外掛程式。

工程檔案 -.pro

qt += core

qt -= gui

config += c++11

config += console

includepath += $$pwd/..

sources += main.cpp

win32 else

為了能在程式中使用外掛程式相關的介面,需要使用includepath將外掛程式的相關路徑包含進來。

main() 函式

注意:對於使用外掛程式的應用程式,qt 外掛程式只是乙個qobject,該qobject使用多重繼承來實現外掛程式介面。

main.cpp內容如下:

#include

#include

#include

#include

#include

#include

void loadplugin()

else }}

}int main(int argc, char *ar**)

初始化pluginsdir成員變數,以引用plugins子目錄。然後,使用qdir::entrylist()獲取該目錄中所有檔案列表,並通過foreach迭代結果,嘗試使用qpluginloader載入外掛程式。

外掛程式提供的qobject可以通過qpluginloader::instance()訪問。如果動態庫不是 qt 外掛程式,或者是由不相容版本的 qt 庫進行編譯,qpluginloader::instance()將返回乙個空指標。

對於每個外掛程式,可以根據qpluginloader::metadata()來獲取其元資料(定義在 json 檔案中)。要檢查外掛程式實現的介面,需要使用qobject_cast(),從而進一步訪問介面中的定義。

Qt 發布應用程式

qt 官方開發環境使用的動態鏈結庫方式,在發布生成的exe程式時,需要複製一大堆 dll,如果自己去複製dll,很可能丟三落四,導致exe在別的電腦裡無法正常執行。因此 qt 官方開發環境裡自帶了乙個工具 windeployqt.exe。以官方 qt 5.8.0 mingw 開發環境為例,從開始選單...

Qt發布應用程式

1.首先找到你的qt的安裝位置 例如我的位置 d qt58 找到d qt58 5.8 msvc2015 64 bin windeployqt.exe 2.找到你想要發布的應用程式的資料夾 例如我的位置 d xx qtdoc build release release xtest.exe 3.管理員方...

Silverlight應用程式擴充套件服務

使用應用程式擴充套件服務可以擴充套件 silverlight 應用程式模型。通常使用擴充套件服務來封裝特定功能域中由多個應用程式使用的功能。例如,可以使用擴充套件服務來實現專用 處理或自定義資料訪問層。本主題包含以下各節 服務以您指定的順序進行註冊。這使您能夠建立對之前註冊的服務具有依賴項的服務。必...