Qt 插件 V4

qt插件在windows下就是態鏈接庫,或者說靜態鏈接庫。(dll lib) 下文統稱爲qt插件。

主程序不需要lib文件就可以使用qt插件,並且可以編譯成功;有點類似於動態加載dll。



4.8.7\examples\tools\echoplugin

1). 定義接口

class EchoInterface
{
public :
    virtual ~EchoInterface(){}
    virtual QString echo(const QString &msg) = 0;

};

Q_DECLARE_INTERFACE(EchoInterface, "EchoInterface")

Q_DECLARE_INTERFACE(EchoInerface, "EchoInterface")

接口類名                   接口文本名字(任意 區分其他接口)


2)定義插件  插件了實現接口中的函數

#include "echointerface.h"
class EchoPlugin: public QObject, EchoInterface
{
    Q_OBJECT
    Q_INTERFACES(EchoInterface)
public:
    QString echo(const QString &msg);
};
       Q_INTERFACES(EchoInterface)    表明該插件實現的是哪個接口

接口類名


#include "echoplugin.h"
#include <QtGui>

QString EchoPlugin::echo(const QString &msg)
{
    return msg;
}

Q_EXPORT_PLUGIN2(echoplugin, EchoPlugin)
    Q_EXPORT_PLUGIN2(echoplugin, EchoPlugin)  表明導出的lib文件 dll文件名是什麼 以及插件類是哪個

文件名           插件類名

3)使用插件

EchoInterface *interface;  // 接口指針

bool load()
{
    QDir pluginDir(".");   // 準備在當前文件夾查找 dll 插件文件

    foreach(QString filename, pluginDir.entryList(QDir::Files))
    {
        qDebug()<<filename;
        QPluginLoader loader(pluginDir.absoluteFilePath(filename));  //  加載每個文件
        QObject *plugin = loader.instance();                         //  返回實例對象
        if(plugin)
        {
            interface = qobject_cast<EchoInterface*>(plugin);        //  若屬於EchoInterface接口,則表明插件存在
            if(interface)
                return true;
        }
    }

    return false;
    qDebug()<<"failed to load";
}

interface->echo("message");    // 插件存在   則可以直接調用其函數


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