首先我们来创建一个插件工程:
选择以下工程模板
插件名称叫做:Plugin01
然后自动生成以下文件:
接下来添加一个头文件,创建插件的基类,定义插件里要实现的内容,如下:
然后让Plugin01继承这个接口类和QObject类,并实现接口中定义的函数,如下:
点击构建,这时候在生成目录下会生成库文件:
好了,插件创建完成了,我们再来创建一个工程调用这个插件。
创建一个普通的工程,添加一个按钮,调用这个插件,界面如下
把上面生成的.a库文件添加到调用程序的工程文件中
在调用程序的exe文件目录下创建一个plugins文件夹并将上面生成的.dll文件复制进去,如下
然后把插件工程中的接口基类头文件添加到调用工程中,这时文件结构:
添加调用插件的代码:
QDir pluginsDir(QDir::currentPath());
pluginsDir.cd("plugins");
foreach (QString fileName, pluginsDir.entryList(QDir::Files))
{
QFileInfo pluginFileInfo(fileName);
if (pluginFileInfo.completeSuffix() == "dll" ||
pluginFileInfo.completeSuffix() == "so")
{
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName), nullptr);
QObject *plugin = pluginLoader.instance();
if (plugin)
{
PluginInterface *monster = qobject_cast<PluginInterface *>(plugin);
qDebug() << monster->name();
}
}
}
效果如下:
基类指针调用子类中的方法,就是c++中的多态 。