在学习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文件放入到可执行文件的目录下,读取插件依旧失败。

6433

被折叠的 条评论
为什么被折叠?



