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 的创建和调用。
Qt Plugin 创建与加载
本文介绍了如何在Qt中创建和动态加载插件(plugin),包括定义接口、实现插件类、导出插件以及如何使用QPluginLoader进行动态加载。
2879

被折叠的 条评论
为什么被折叠?



