Qt的插件机制
1.前言
插件是一種遵循一定規范的應用程序接口編寫出來的程序。很多軟件都有插件,插件有無數種。例如在IE中,安裝相關的插件后,WEB瀏覽器能夠直接調用插件程序,用于處理特定類型的文件。2.QT插件API
Qt有兩種與插件有關的API。一種用來擴展Qt本身的功能,如自定義數據庫驅動,圖像格式,文本編解碼,自定義分格,等等,稱為Higher-Level API。另一種用于應用程序的功能擴展,稱為Lower-Level API。前一種是建立在后一種的基礎之上的。這里討論的是后一種,即用來擴展應用程序的Lower-level API。3.應用程序支持插件擴展的步驟
1. 定義一個接口集(只有純虛函數的類),用來與插件交流。2. 用宏Q_DECLARE_INTERFACE()將該接口告訴Qt元對象系統。
Q_DECLARE_INTERFACE(BrushInterface,"com.trolltech.PlugAndPaint.BrushInterface/1.0") 3. 應用程序中用QPluginLoader來裝載插件。
4. 用宏qobject_cast()來確定一個插件是否實現了接口。
QObject *obj = new QTimer; QTimer *timer = qobject_cast<QTimer *>(obj);
4.寫一個插件的步驟
寫一個插件的步驟:1. 聲明插件類,該類從QObject和該插件希望實現的接口繼承而來。
2. 用宏Q_INTERFACES()將該接口告訴Qt元對象系統。
class BasicToolsPlugin : public QObject, public BrushInterface, public ShapeInterface, public FilterInterface { Q_OBJECT Q_INTERFACES(BrushInterface ShapeInterface FilterInterface) public: ... }; 3. 用宏Q_EXPORT_PLUGIN2()導出插件。
Q_EXPORT_PLUGIN2 ( PluginName, ClassName ) 4. 用適當的.pro文件構建插件。下面的代碼聲明了一個接口類:
class FilterInterface { public: virtual ~FilterInterface() {} virtual QStringList filters() const = 0; virtual QImage filterImage(const QString &filter, const QImage &image, QWidget* parent)=0; }; Q_DECLARE_INTERFACE(FilterInterface, "com.trolltech.PlugAndPaint.FilterInterface/1.0") 這里是實現該接口的插件類的定義:
#include <QObject> #include <QStringList> #include <QImage> #include <plugandpaint/interfaces.h> class ExtraFiltersPlugin : public QObject, public FilterInterface { Q_OBJECT Q_INTERFACES(FilterInterface) public: QStringList filters() const; QImage filterImage(const QString &filter, const QImage &image, QWidget *parent); }; 示例 Plug & Paint 的文檔詳細解釋了這一過程。與Qt Designer有關的問題請看Creating Custom Widgets for Qt Designer 。 Echo Plugin Example 是一個關于如何實現擴展Qt應用程序的詳細示例。
5.裝載插件
裝載插件時。Qt庫有一些健全檢查來確定插件能否被裝載和使用。這就可以同時安裝多個版本和Qt庫配置。與較高主版本和(或)次版本號的Qt庫鏈接的插件不能被主版本和(或)次版本號較低的庫裝載。
原理: 一個使用新版Qt庫的插件可能用了老版本沒有的新特征。Trolltech有一個只在次版本號升級時添加新功能和API的政策,這就是為什么該測試只看主次版本號,而不看補丁號。
Qt庫和所有插件用一個聯編關鍵字來聯編。Qt庫中的聯編關鍵字被與插件中的聯編關鍵字對照,如果相符,插件就被裝載。如果聯編關鍵字不符,Qt庫就拒絕裝載該插件。
原理: 見下文對聯編關鍵字的解釋。
編譯插件來擴展應用程序時,確保插件和應用程序用同樣的配置這一點很重要。這意味著如果應用程序是release模式編譯的,那么插件也要是release模式。
若將Qt配置為debug和release模式都編譯,但只在release模式下編譯應用程序,就要確保你的插件也是在release模式下編譯的。缺省的,若Qt的debug編譯可用,插件就只在debug模式下編譯。要強制插件用release模式編譯,要在工程中添加:
CONFIG += release這能確保插件兼容應用程序中所用的庫版本。
總結
- 上一篇: 我看中国软件---人才篇
- 下一篇: [CB]加快BCB编译速度