Qt plugin 的创建和动态加载
介绍
plug in 是一个实现了一个或多个接口的DLL,下面我们将介绍在QT中如何创建PLUG IN 和如何动态加载PLUG IN
创建plug in
首先定义一个Interface,并且用Q_DECLARE_INTERFACE宏告知qt meta-object system有这 样一个interface,代码如下:
class EchoInterface { public: virtual ~EchoInterface() {} virtual QString echo(const QString &message) = 0; }; QT_BEGIN_NAMESPACE Q_DECLARE_INTERFACE(EchoInterface, "com.trolltech.Plugin.EchoInterface/1.0"); QT_END_NAMESPACE
其次定义一个plugin的类,必须从interface继承,并在.h用Q_INTERFACE告诉meta-object system我们的类支持这样的interface,具体代码如下:
class EchoPlugin : public QObject, EchoInterface { Q_OBJECT Q_INTERFACES(EchoInterface) public: QString echo(const QString &message); };
实现这个类并用Q_EXPORT_PLUGIN2(pluginName,class)导出这个plugin,具体代码如下:
Q_EXPORT_PLUGIN2(echoplugin, EchoPlugin);
建立合适的.pro文件来编译这个plugin,具体代码如下:
TEMPLATE = lib CONFIG += plugin INCLUDEPATH += ../echowindow HEADERS = echoplugin.h SOURCES = echoplugin.cpp TARGET = $$qtLibraryTarget(echoplugin) DESTDIR = ../plugins
其中DESTDIR 指定 DLL 生成的路径,TARGET TARGET的内容必须和Q_EXPORT_PLUGIN2中的pluginName一致;这样我们就创建了一个PLUG IN,接下来我们看下如何动态加载PLUG IN 。
动态加载plug in
我们通过QPluginLoader 来加载 plug in , 具体代码如下:
QDir pluginsDir(qApp->applicationDirPath()); #if defined(Q_OS_WIN) if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release") pluginsDir.cdUp(); #elif defined(Q_OS_MAC) if (pluginsDir.dirName() == "MacOS") { pluginsDir.cdUp(); pluginsDir.cdUp(); pluginsDir.cdUp(); } #endif pluginsDir.cd("plugins"); foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName)); qDebug()<<pluginsDir.absoluteFilePath(fileName); pluginLoader.load(); QObject *plugin = pluginLoader.instance(); if (plugin) { echoInterface = qobject_cast<EchoInterface *>(plugin); if (echoInterface) return true; } }
这样我们就完成了 一个PLUG IN 的创建和调用。