开发了一个测试SOA的工具,现在想在工具的框架中增加 插件的功能。
- 主工程中增加interface class
- 新建一个插件dll
- 主工程中增加加载插件的函数
主工程中增加一个抽象类定义接口函数:
#ifndef PLUGININTERFACE_H
#define PLUGININTERFACE_H
#include<QString>
#include <QtPlugin>
#define PLUGIN_INTERFACE_VERSION "1.0.1"
class QSOAPluginInterface
{
public:
virtual ~QSOAPluginInterface(){};
virtual QString name() = 0;
};
Q_DECLARE_INTERFACE(QSOAPluginInterface,
"org.genivi.SOA.Plugin.SOAPluginInterface/1.0")
#endif // PLUGININTERFACE_H
Q_DECLARE_INTERFACE(QSOAPluginInterface,"org.genivi.SOA.Plugin.SOAPluginInterface/1.0")
Q_DECLARE_INTERFACE 是 Qt 宏,用于声明一个接口类。
接口类是一种纯虚函数类,它只包含纯虚函数,没有数据成员和实现函数。接口类的作用是定义一组规范,由派生类实现具体的功能。在 C++ 中,接口类通常用于实现多态性和抽象类1。
Q_DECLARE_INTERFACE 需要两个参数,第一个参数是接口的名称,第二个参数是接口的 IID。这个宏需要引用包含元数据内容的文件。
新建一个dll 工程:
新建C++ library
新建了一个pluginTest 的工程
工程中文件的内容:
plugintest.h
#ifndef PLUGINTEST_H
#define PLUGINTEST_H
#include "pluginTest_global.h"
#include <QObject>
#include <QtPlugin>
#include"../../SomeipTool/plugininterface.h"
class PLUGINTEST_EXPORT PluginTest:public QObject,public QSOAPluginInterface
{
Q_OBJECT
Q_INTERFACES(QSOAPluginInterface)
Q_PLUGIN_METADATA(IID "org.genivi.SOA.Plugin.pluginTest/1.0")
public:
PluginTest();
virtual QString name();
};
#endif // PLUGINTEST_H
plugintest.cpp
#include "plugintest.h"
PluginTest::PluginTest()
{
}
QString PluginTest::name()
{
return "PluginTest";
}
主工程中调用 dll 中的接口 name
头文件中定义一个指针:QSOAPluginInterface* m_pInterface { nullptr};
定义一个加载dll 的函数:bool loadPlugin();
bool MainWindow::loadPlugin()
{
QDir pluginsDir(qApp->applicationDirPath());
QStringList filters;
filters << "*.dll" << "*.so" << "*.dylib";
pluginsDir.setNameFilters(filters);
qDebug()<<pluginsDir.dirName();
pluginsDir.cd("plugins");
foreach(QString fileName, pluginsDir.entryList(QDir::Files)) {
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = pluginLoader.instance();
qDebug()<<__FUNCTION__<<pluginLoader.errorString();
if(plugin) {
m_pInterface = qobject_cast<QSOAPluginInterface*>(plugin);
if(m_pInterface) {
return true;
}
}
}
return false;
}
编译后生成的dll
测试相关的接口:
this->loadPlugin();
if(m_pInterface!=nullptr)
qDebug()<< m_pInterface->name();
出现如下错误
需要在工程文件中添加如下内容:
QT += core gui
greaterThan(QT_MAJOR_VERSION,4):QT+=widgets