QT 工程中开发插件dll

开发了一个测试SOA的工具,现在想在工具的框架中增加 插件的功能。

  1. 主工程中增加interface class
  2. 新建一个插件dll
  3. 主工程中增加加载插件的函数

 主工程中增加一个抽象类定义接口函数:

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值