偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Qt的插件機(jī)制

移動開發(fā)
本文講述的是Qt的插件機(jī)制,插件是一種遵循一定規(guī)范的應(yīng)用程序接口編寫出來的程序。很多軟件都有插件,插件有無數(shù)種。例如在IE中,安裝相關(guān)的插件后,WEB瀏覽器能夠直接調(diào)用插件程序,用于處理特定類型的文件。

Qt有兩種與插件有關(guān)的API。一種用來擴(kuò)展Qt本身的功能,如自定義數(shù)據(jù)庫驅(qū)動,圖像格式,文本編解碼,自定義分格,等等,稱為Higher-Level API。另一種用于應(yīng)用程序的功能擴(kuò)展,稱為Lower-Level API。前一種是建立在后一種的基礎(chǔ)之上的。這里討論的是后一種,即用來擴(kuò)展應(yīng)用程序的Lower-level API。

讓應(yīng)用程序支持插件擴(kuò)展的步驟:

1. 定義一個接口集(只有純虛函數(shù)的類),用來與插件交流。

2. 用宏Q_DECLARE_INTERFACE()將該接口告訴Qt元對象系統(tǒng)。

  1. Q_DECLARE_INTERFACE(BrushInterface,"com.trolltech.PlugAndPaint.BrushInterface/1.0")  

3. 應(yīng)用程序中用QPluginLoader來裝載插件。

4. 用宏qobject_cast()來確定一個插件是否實現(xiàn)了接口。

  1. QObject *obj = new QTimer;    
  2. QTimer *timer = qobject_cast<QTimer *>(obj);  

寫一個插件的步驟:

1. 聲明插件類,該類從QObject和該插件希望實現(xiàn)的接口繼承而來。

2. 用宏Q_INTERFACES()將該接口告訴Qt元對象系統(tǒng)。

  1. class BasicToolsPlugin : public QObject,  
  2.                            public BrushInterface,  
  3.                            public ShapeInterface,  
  4.                            public FilterInterface  
  5.   {  
  6.       Q_OBJECT  
  7.       Q_INTERFACES(BrushInterface ShapeInterface FilterInterface)  
  8.   public:  
  9.       ...  
  10.    };  

3. 用宏Q_EXPORT_PLUGIN2()導(dǎo)出插件。

  1. 1 Q_EXPORT_PLUGIN2 ( PluginName, ClassName ) 

4. 用適當(dāng)?shù)?pro文件構(gòu)建插件。下面的代碼聲明了一個接口類:

  1. class FilterInterface  
  2.  {  
  3.  public:  
  4.        virtual ~FilterInterface() {}  
  5.        virtual QStringList filters() const = 0;  
  6.        virtual QImage filterImage(const QString &filter, const QImage &image, QWidget* parent)=0;  
  7.  };   
  8.  Q_DECLARE_INTERFACE(FilterInterface, "com.trolltech.PlugAndPaint.FilterInterface/1.0") 

這里是實現(xiàn)該接口的插件類的定義:

  1. #include <QObject> 
  2. #include <QStringList> 
  3. #include <QImage>   
  4. #include <plugandpaint/interfaces.h> 
  5.  
  6. class ExtraFiltersPlugin : public QObject, public FilterInterface  
  7. {  
  8.  Q_OBJECT  
  9. Q_INTERFACES(FilterInterface)  
  10.  
  11. public:  
  12.     QStringList filters() const;  
  13.     QImage filterImage(const QString &filter, const QImage &image,  
  14.     QWidget *parent);  
  15. }; 

示例 Plug & Paint 的文檔詳細(xì)解釋了這一過程。與Qt Designer有關(guān)的問題請看Creating Custom Widgets for Qt Designer 。 Echo Plugin Example 是一個關(guān)于如何實現(xiàn)擴(kuò)展Qt應(yīng)用程序的詳細(xì)示例。

#p#

裝載插件

裝載插件時。Qt庫有一些健全檢查來確定插件能否被裝載和使用。這就可以同時安裝多個版本和Qt庫配置。

與較高主版本和(或)次版本號的Qt庫鏈接的插件不能被主版本和(或)次版本號較低的庫裝載。

原理: 一個使用新版Qt庫的插件可能用了老版本沒有的新特征。Trolltech有一個只在次版本號升級時添加新功能和API的政策,這就是為什么該測試只看主次版本號,而不看補(bǔ)丁號。

Qt庫和所有插件用一個聯(lián)編關(guān)鍵字來聯(lián)編。Qt庫中的聯(lián)編關(guān)鍵字被與插件中的聯(lián)編關(guān)鍵字對照,如果相符,插件就被裝載。如果聯(lián)編關(guān)鍵字不符,Qt庫就拒絕裝載該插件。

原理: 見下文對聯(lián)編關(guān)鍵字的解釋。

編譯插件來擴(kuò)展應(yīng)用程序時,確保插件和應(yīng)用程序用同樣的配置這一點很重要。這意味著如果應(yīng)用程序是release模式編譯的,那么插件也要是release模式。

若將Qt配置為debug和release模式都編譯,但只在release模式下編譯應(yīng)用程序,就要確保你的插件也是在release模式下編譯的。缺省的,若Qt的debug編譯可用,插件就只在debug模式下編譯。要強(qiáng)制插件用release模式編譯,要在工程中添加:

 CONFIG += release這能確保插件兼容應(yīng)用程序中所用的庫版本。

關(guān)鍵字

裝載插件時,Qt核對每一個插件的聯(lián)編關(guān)鍵字要和自己的匹配,以保證所裝載的是兼容的插件;任何不匹配的插件不會被裝載。

聯(lián)編關(guān)鍵字包含一下信息:

  1. Architecture, operating system and compiler.  

原理: 在同一編譯器的不同版本并不產(chǎn)生二進(jìn)制兼容代碼的場合,編譯器的版本也體現(xiàn)在聯(lián)編關(guān)鍵字里。

Qt庫的配置。這個配置是庫中所缺少特性的列表,因為這些功能對應(yīng)的API在該庫中不可用。

原理: 兩個同一版本的Qt庫的不同配置不是二進(jìn)制兼容的。裝載插件的Qt庫使用這個(缺少的)特性列表來判斷插件是不是二進(jìn)制兼容的。

注意: 也存在這種情況,插件可以使用在兩個不同配置里可用到的特性。但是,編寫插件的開發(fā)者需要知道,哪些特性在他們的插件和Qt的公用工具類中都在被使用。Qt庫在裝載插件時會需要復(fù)雜的特性與依賴性的查詢確認(rèn)。這些需求給開發(fā)者添了一個不必要的負(fù)擔(dān),也增加了裝載插件的系統(tǒng)開銷。為了減少開發(fā)時間,降低應(yīng)用的運行時消耗,可以使用對聯(lián)編關(guān)鍵字的簡單字符串比較。

可選地,可以在配置腳本命令行指定一個附加的字符串Optionally, an extra string may be specified on the configure script command line.

原理: 在發(fā)布帶有應(yīng)用程序的Qt庫的二進(jìn)制時,這給開發(fā)者提供了一個編寫插件的辦法,這樣寫出來的插件只能被插件鏈接的那個庫所裝載。

為了調(diào)試可能需要關(guān)閉聯(lián)編關(guān)鍵字校驗功能,這可以通過將你運行應(yīng)用程序的環(huán)境的環(huán)境變量QT_NO_PLUGIN_CHECK設(shè)置為非零來實現(xiàn)。

#p#

靜態(tài)類

插件能被靜態(tài)地鏈接到應(yīng)用程序。如果你創(chuàng)建了Qt的靜態(tài)版本,這僅僅是用來包含Qt的預(yù)定義插件的一個選項。

當(dāng)被作為靜態(tài)庫編譯時,Qt提供下面這些靜態(tài)插件:

Qt的插件機(jī)制

要靜態(tài)鏈接這些插件,你的應(yīng)用程序中要用到宏Q_IMPORT_PLUGIN() 并且要用QTPLUGIN將需要的插件添加到你的編譯中。例如,在main.cpp中:

  1. #include <QApplication> 
  2. #include <QtPlugin> 
  3. Q_IMPORT_PLUGIN(qjpeg)  
  4. Q_IMPORT_PLUGIN(qgif)  
  5. Q_IMPORT_PLUGIN(qkrcodecs)  
  6.  int main(int argc, char *argv[])  
  7.  {  
  8.      QApplication app(argc, argv);  
  9.      ...  
  10.      return app.exec();  
  11.  } 

應(yīng)用程序的.pro 文件中要用下列條目:

  1. QTPLUGIN     += qjpeg \  
  2.                 qgif \  
  3.                 qkrcodecs 

也可以創(chuàng)建自己的靜態(tài)庫,步驟如下:

在插件的 .pro 文件中添加 CONFIG += static 。

應(yīng)用程序中用宏 Q_IMPORT_PLUGIN() 。

應(yīng)用程序的.pro 文件中用 LIBS 將靜態(tài)庫鏈接進(jìn)來。

參見示例 Plug & Paint 和相關(guān)的插件 Basic Tools 來獲得詳情。

The Plugin Cache

為了加速插件的裝載和確認(rèn),裝載插件時收集的信息被緩存到QSettings中。這包括插件是否被成功裝載的信息,以使后面的裝載操作不用再嘗試裝載無效的插件。但是,若一個插件的 last modified 時間戳被修改,插件的緩存條目是無效的并且插件會不管緩存條目中的值而被重新裝載,同時緩存條目本身也會被新的值替代。

這也意味著每一次插件或任何依賴資源(如共享庫)被更新之后時間戳也必須被更新,因為依賴資源可能影響一個插件裝載的結(jié)果。

有時,開發(fā)插件時,需要從插件緩存中移除條目。因為Qt用QSettings來管理插件緩存,插件的位置是依賴于平臺的;更多關(guān)于每一個平臺的信息請參看the QSettings documentation。

例如,Windows中這些條目存儲在注冊表中,每個插件的路徑是以下面兩個字串中的一個開始的:

 

  1. HKEY_CURRENT_USER\Software\Trolltech\OrganizationDefaults\Qt Plugin Cache 4.2.debug  
  2. HKEY_CURRENT_USER\Software\Trolltech\OrganizationDefaults\Qt Plugin Cache 4.2.falseDebugging Plugins 

有許多問題可能影響到插件在應(yīng)用程序中的正常運轉(zhuǎn)。  許多與插件和應(yīng)用程序的創(chuàng)建方法不同有關(guān), 通常發(fā)生在不同的創(chuàng)建系統(tǒng)和過程中。

下表描述的是開發(fā)者創(chuàng)建插件時遇到的問題的常見原因:

Qt的插件機(jī)制

也可以用QT_DEBUG_PLUGINS環(huán)境變量來從Qt中獲得嘗試去裝載的每一個插件的診斷信息。在應(yīng)用程序的運行環(huán)境中把該變量的值設(shè)置為非零。

【編輯推薦】

Qt Symbian SDK 安裝

官方文檔:bada API參考資料

深度解析嵌入式QT開發(fā)環(huán)境搭建

十個插件保護(hù)WordPress網(wǎng)頁安全

QML教程:構(gòu)建和安裝QtComponents

諾基亞三大支柱支撐新戰(zhàn)略 開放所有平臺API

責(zé)任編輯:zhaolei 來源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2021-06-22 06:52:46

Vite 插件機(jī)制Rollup

2009-12-11 10:29:03

PHP插件機(jī)制

2010-09-08 14:39:35

2023-11-07 10:19:08

2024-07-17 09:23:58

Vite插件機(jī)制

2011-01-21 15:02:14

jQuerywebJavaScript

2023-06-15 08:01:01

Vite插件機(jī)制

2020-05-22 09:10:10

前端框架插件

2019-12-19 08:56:21

MybatisSQL執(zhí)行器

2021-03-04 08:19:29

插件機(jī)制代碼

2021-12-19 07:21:48

Webpack 前端插件機(jī)制

2021-12-03 15:59:30

Nuxt3插件機(jī)制

2011-06-23 14:40:13

Qt 信號

2011-06-09 09:45:35

Linux QT 信號

2011-07-01 15:04:49

Qt 內(nèi)省

2011-06-23 14:05:32

Qt 事件機(jī)制

2011-06-27 17:24:37

Qt 插件

2021-03-15 08:40:42

Vue組件函數(shù)

2011-07-05 18:40:19

QT 信號 機(jī)制

2011-07-01 14:14:34

Qt 事件
點贊
收藏

51CTO技術(shù)棧公眾號