1.接口文件PlugInterface.h
#include <QtPlugin>
//接口类必须是虚基类,除构造函数、析构函数(最好定义为虚函数)外的成员函数都必须是纯虚函数。
class PlugInterface
{
public:
virtual QString getPluginName() = 0;
};
//Q_DECLARE_INTERFACE宏告诉Qt这个纯虚类是一个插件接口。
//第一个参数是接口类名,第二个参数是插件标识符,标识符是大小写敏感的且必须是唯一的
Q_DECLARE_INTERFACE(PlugInterface, "com.pluginterface.myplugin");
2.插件头文件Plugin.h
#include "plugin_global.h"
#include "PlugInterface.h"
//插件必须继承接口类PlugInterface和QObject。
class PLUGIN_EXPORT Plugin :public QObject, public PlugInterface
{
Q_OBJECT
//Q_PLUGIN_METADATA宏用于描述插件元数据,第一个参数IID是必须的,同插件标识一样
//而第二个参数FILE是可选的,指定一个本地json文件,该文件中可以描述插件的相关数据信息
Q_PLUGIN_METADATA(IID "com.myplugin" FILE "a.json")
Q_INTERFACES(PlugInterface)
public:
Plugin();
virtual ~Plugin();
QString getPluginName();
void showMessageBox();
};
3.插件源文件Plugin.cpp
#include "Plugin.h"
#include <QMessageBox>
Plugin::Plugin()
{
}
Plugin:: ~Plugin()
{
}
QString Plugin::getPluginName()
{
return "Plugin";
}
void Plugin::showMessageBox()
{
}
4.使用插件
QString strExePath = QCoreApplication::applicationDirPath(); //exe路径
QPluginLoader loader(strExePath+"/Plugin.dll"); //加载插件
if (loader.load()) {
QObject *obj = loader.instance(); //实例化插件
if (obj) {
PlugInterface *pPluginInterface = qobject_cast<PlugInterface*>(obj);
Plugin* pPlugin = (Plugin*)pPluginInterface;
if (pPlugin) {
qDebug() << pPlugin->getPluginName();// 测试插件方法
qDebug() << loader.metaData();// 输出插件元数据
}
}
}