【轉】Qt 擴展插件

讓基於QT的應用程序支持插件擴展的步驟:
1.    定義一個接口集(只有純虛函數的類),用來與插件交流。如:
class DbmInterface
{
public:
    virtual ~DbmInterface() {}

    virtual testpro* create(QString &clname) = 0;
};
2. 用宏Q_DECLARE_INTERFACE()將該接口告訴Qt元對象系統
Q_DECLARE_INTERFACE(DbmInterface, "com.trolltech.dbm.DbmInterface/1.0")

3. 應用程序中用QPluginLoader來裝載插件。
QPluginLoader loader(".//testplug.dll");

4. 用宏qobject_cast()來確定一個插件是否實現了接口。如果成功則可以直接調用插件接口函數。
QObject *plugin = loader.instance();
if (plugin)
    {
        DbmInterface* dbm = qobject_cast<DbmInterface*>(plugin);
        if (dbm)
            proa = dbm->create(QString(""));
    }



▲寫一個插件的步驟:
1.    聲明插件類,該類從QObject和該插件希望實現的接口繼承而來。
2. 用宏Q_INTERFACES()將該接口告訴Qt元對象系統。
class DbmInterfacePlugin : public QObject, public DbmInterface
{
    Q_OBJECT
        Q_INTERFACES(DbmInterface)

public:
    ~DbmInterfacePlugin(){};

    testpro* create(QString &clname){return new ipro;};
};
3. 用宏Q_EXPORT_PLUGIN2()導出插件(在CPP文件中)。
Q_EXPORT_PLUGIN2(testplug, DbmInterfacePlugin);

▲編譯插件來擴展應用程序時,確保插件和應用程序用同樣的配置這一點很重要。這意味着如果應用程序是release模式編譯的,那麼插件也要是release模式。

▲裝載插件時,Qt覈對每一個插件的聯編關鍵字要和自己的匹配,以保證所裝載的是兼容的插件;任何不匹配的插件不會被裝載。

▲爲了調試可能需要關閉聯編關鍵字校驗功能,這可以通過將你運行應用程序的環境的環境變量QT_NO_PLUGIN_CHECK設置爲非零來實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章