QT插件的开发与调用

在学习QT插件开发时,为了更好的理解,我将其类比于设计模式的抽象工厂模式。

我所接触到的第一个插件开发的例子为:

主工程提供一个插件的基类(头文件),作为插件接口,声明了插件的功能函数,为虚函数。

主工程下的子工程,即插件工程,声明插件类,对插件基类(接口)的虚函数进行实现(重写)。

在主工程中读取插件,并调用插件中的函数来完成相应工作。

代码是通过这一篇学习的:(23条消息) Qt插件开发_枫影竹韵的博客-CSDN博客_qt插件式开发

下面是用作测试的例子:

目录结构:

 首先要写的就是基类的接口,其实质就是一个纯虚类,只是声明了插件功能的虚函数。

插件基类(接口):plugin_tap.h

#ifndef PLUGIN_TAP_H
#define PLUGIN_TAP_H
//定义接口
class arithInterface
{
public:
    virtual ~arithInterface(){}
    virtual int add(int a,int b)=0;
    virtual int div(int a,int b)=0;
    virtual int multiply(int a,int b)=0;
    virtual int sub(int a,int b)=0;
};

#define arithInterface_iid "Examples.Pulgin.arithInterface"
//arithInterface_iid 宏定义字符串一定要是唯一的
//然后使用宏Q_DECLARE_INTERFACE来声明该接口。

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(arithInterface,arithInterface_iid)
QT_END_NAMESPACE

#endif // PLUGIN_TAP_H

插件功能的实现:

插件的功能为,进行两个整数的加、减、乘、除运算,并返回结果

插件头文件arithplugin.h

#ifndef ARITHPLUGIN_H
#define ARITHPLUGIN_H

#include <QObject>
#include <QtPlugin>
#include "../frmMain/plugin_tap.h"


class arithPlugin : public QObject,public arithInterface
{
    Q_OBJECT
    Q_INTERFACES(arithInterface)
    Q_PLUGIN_METADATA(IID arithInterface_iid)// FILE "arithplugin.json"
public:
    explicit arithPlugin(QObject *parent = nullptr);
    int add(int a,int b);
    int div(int a,int b);
    int multiply(int a,int b);
    int sub(int a,int b);
};

#endif // ARITHPLUGIN_H

arithplugin.cpp

#include "arithplugin.h"

arithPlugin::arithPlugin(QObject *parent): QObject(parent)
{

}

int arithPlugin::add(int a, int b)
{
    return a+b;
}


int arithPlugin::div(int a, int b)
{
    if(b!=0)
        return a/b;
    else
        return -1;
}

int arithPlugin::multiply(int a, int b)
{
    return a*b;

}

int arithPlugin::sub(int a, int b)
{
    return a-b;
}

下面部分是在主项目中所要做的:

头文件

    //读取插件   
    bool loadPlugin();
    //用于调用插件函数的指针
    arithInterface *m_pInterface = nullptr;

cpp中读取插件:

bool MainWindow::loadPlugin()
{
    arithInterface * m_pInterface;
    
    //读取DLL
    QPluginLoader loader("arithplugin.dll");
    //读取失败则打印报错
    if(!loader.isLoaded())
    {
        qDebug() << loader.errorString();
        return false;
    }
    //返回插件的根组件对象。如果需要的话,会加载插件。
    //如果插件不能被加载或者根组件对象不能被实例化,函数返回0
    QObject*  loaderplugin= loader.instance();

    if (loaderplugin)
    {
        m_pInterface = qobject_cast<arithInterface * >(loaderplugin);
        //之后可以使用m_pInterface调用插件的方法。
    }
    return true;
}

使用插件:

选择不同的运算符,通m_pInterface来调用插件中的不同的函数

//选择不同的运算符,通m_pInterface来调用插件中的不同的函数
void MainWindow::on_pushButton_2_clicked()
{
    int a=ui->lineEdit->text().toInt();
    int b=ui->lineEdit_2->text().toInt();
    char c;
    int ans;
    switch (c) {
    case '+':
       ans=m_pInterface->add(a,b);
       break;
    case '-':
       ans=m_pInterface->div(a,b);
       break;
    case 'X':
       ans=m_pInterface->multiply(a,b);
       break;
    case '÷':
       ans=m_pInterface->sub(a,b);
       break;
    default:
        break;
    }
    ui->lineEdit_3->setText(QString::number(ans));
}

最终插件调用失败,未找到原因

尝试把构建好的插件的DLL文件放入到可执行文件的目录下,读取插件依旧失败。

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值