QLibrary可以加载动态库,也可以使用QPluginLoder加载动态库,本文主要介绍QPluginLoder的实现:
1、创建动态库项目
2、选择Qt Plugin选项
3.定义接口类
#ifndef ITEST_H
#define ITEST_H
#include <QObject>
#include <QJsonObject>
#define ITest_iid"org.rzt.ITest/1.0"
class ITest:public QObject
{
Q_OBJECT
public:
virtual ~ITest(){}
virtual void testData() = 0;
};
Q_DECLARE_INTERFACE(ITest, ITest_iid)
#endif // ITEST_H
4、具体实现类
#ifndef TEST_H
#define TEST_H
#include "ITest.h"
class Q_DECL_EXPORT Test: public ITest
{
Q_OBJECT
Q_INTERFACES(ITest)
Q_PLUGIN_METADATA(IID ITest_iid)
public:
Test();
virtual ~Test() override;
virtual void testData()override { };
};
#endif // TEST_H
5、模板方式调用
//定义模板加载
template<typename T>
static T* loadOnePlugin(const QString& strPuginPath)
{
QPluginLoader pluginLoader(strPuginPath);
QObject *plugin = pluginLoader.instance();
T* t = qobject_cast<T*>(plugin);
if (t == Q_NULLPTR)
{
qDebug() << pluginLoader.errorString();
}
return t;
}
//具体使用方法
ITest *pTest = loadOnePlugin<ITest>(“./ITest.dll”);
相关宏解释:
Q_DECLARE_INTERFACE:Q_DECLARE_INTERFACE 是一个定义了使 qobject_cast<T*>()返回指针的帮助函数的一个宏
Q_DECL_EXPORT :用于导出类
Q_INTERFACES:元对象系统 moc 运行代码时将检查放于 Q_INTERFACES 的接口的名字是否确实被声明。
Q_PLUGIN_METADATA:用于描述插件元数据