QT插件的开发与调用

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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

 

Qt 插件开发 plugin 超详细 有源码 Qt 插件开发框架类似于前后端的微服务的场景,授权哪个微服务则前端可以使用哪个微服务,插件就行硬件插卡一样,可以被随时删除、插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护;插件主要面向接口编程,无需访问.lib文件,热插拔、利于团队开发。即使在程序运行时.dll不存在,也可以正常启动,只是相应插件功能无法正常使用而已;动态库需要访问.lib文件,而且在程序运行时必须保证.lib存在,否则无法正常启动; 阅读详情

相关推荐

QT/QML插件(Qt Quick 2 Extension Plugin)的使用

1.子工程创建(Qt应用程序) 选择【Subdirs Project】新建工程 2. 创建完成后工程只有一个.pro文件,继续选中工程点击右键,【New SubProject】。如图:新建Qt Quick工程 3.创建插件工程 由于New SubProject没有找到【Qt Quick 2 Extension Plugin】这个插件工程选项。 需要New Project:如图:创建的插件工程名qmlbtmoduleplugins,类名是CBluetooth(注意类名首字母要大写,不然后面编译会

Chen_1994的博客 2567

QT plugins(动态&静态插件编写调用)

使用QTCreator5.9.1 实现的简单动态&静态插件编写 和 调用的小例子,参考了qt自代的plugandpaint,我的样例中没有复杂类和算法,只有简单的加减运算,简单明了,本质是学习静态&动态插件插件的编写调用方法。

Qt插件开发踩坑记:如何用QMetaObject::invokeMethod动态加载并安全调用未知接口?

本文深入探讨了Qt插件开发中动态接口调用的安全策略架构设计,重点介绍了如何使用QMetaObject::invokeMethod实现动态方法调用,包括方法存在性检查、安全调用模式、跨线程调用及版本兼容性处理,为构建健壮的Qt插件系统提供实用解决方案。

weixin_27024175的博客 340

QT_plugin的创建和调用方法

t Plugin和其他类型的插件一样,是一种计算机应用程序,它和主应用程序(host application)互相交互,以提供特定的功能。应用程序支持Plugin有许多原因,一些主要原因包括:使得第三方开发者有能力扩展应用程序,以提供无法先期预料的特色;减小应用程序的大小;由于软件版权之间的不兼容性将源代码和应用程序分享。Qt Plugin 分动态插件和静态插件两种,本文中将做详细说明。

Qt 插件开发详解

Qt插件是一种扩展机制,用于将应用程序的功能模块化,并且可以在运行时动态加载和卸载。Qt框架为插件提供了一套标准的接口和管理机制,使得插件的使用和集成变得简单和灵活,通过插件机制,可以将应用程序的功能划分为独立的可插拔的模块,使得应用程序更加可扩展和维护。动态加载:Qt插件是在运行时动态加载的,允许在不重新编译或重新启动应用程序的情况下添加或移除插件。跨平台:Qt插件系统可以在不同的平台上运行,这意味着开发者可以使用相同的插件代码在Windows、macOS、Linux等多个操作系统上构建应用程序。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 2852

Qt插件开发

前言 插件是一种遵循一定规范的应用程序接口编写出来的程序,本教程说的插件是用于扩展Qt应用程序的插件,笔者做对创建和使用方法,做下简单的记录 一、Qt插件创建和使用流程 1.定义一个接口集(只有纯虚函数的类),用来插件交流。 2.用宏Q_DECLARE_INTERFACE()将该接口告诉Qt元对象系统。 3.应用程序中用QPluginLoader来加载插件。 4.用宏qobject_cast()来判断一个插件是否实现了接口。 二、定义接口文件 在QtCreator中,新建头文件 .

aggs1990的专栏 6003

Qt Plugin插件机制实例

Qt Plugin插件机制实例

m0_60259116的博客 1158

Qt 插件开发全解析:从接口定义,插件封装,插件调用插件间的通信

Qt 插件开发全解析:从接口定义,插件封装,插件调用插件间的通信

qianniulaoren的博客 2891

QT 插件通信接口调用 CTK开发(四)

CTK 为支持生物计算的公共开发包,其全称为 Common Toolkit。为医学成像提供一组统一的基本功能;促进代码和数据的交互及结合;避免重复开发;在工具包(医学成像)范围内不断扩展到新任务,而不会增加现有任务的负担;整合并适应成功的解决方案。本专栏文章较为全面的讲述了CTK插件开发的全部步骤,本文是 QT CTK开发 第四篇文章,目前正在更新中...本文作者原创,未经允许禁止转载。付费资源盗版必究。

断点 996

QT开发框架+插件模式+客户端服务端及插件调用示例

QT开发框架+插件模式+客户端服务端及插件调用示例 去发现同类优质开源项目:https://gitcode.com/ 资源描述 本资源文件提供了一个基于QT开发框架的插件模式示例,涵盖了客户端、服务端以及插件调用的完整实现。通过该示例,您可以深入了解如何利用QT插件框架来实现功能的扩展、模块的独立更新以及降低模块之间的依赖。 资源优势 方便功能的扩展:在GIS引擎设计中,通常不将数据格式的解...

gitblog_09803的博客 571

QT插件开发(1)-- 创建并调用插件

首先我们来创建一个插件工程: 选择以下工程模板 插件名称叫做:Plugin01 然后自动生成以下文件: 然后创建一个头文件,创建插件的基类,定义好插件里要实现的内容,如下: 然后让Plugin01继承这个借口类和QObject类,并实现接口中定义的函数,如下: 点击构建,这时候在生成目录下会生成库文件: 好了,插件创建完成了,我们再来创建一个工程调...

友善啊,朋友的博客 5367

Qt之·Qt插件开发·(1)插件创建并调用插件

public:该宏用于声明一个接口类,并为其生成相关的元对象代码。接口类通常被用作插件开发中的基类,通过该宏可以让Qt识别接口并进行相应的操作。此宏把标识符类名接口关联起来。这个标识符是唯一的Q_OBJECTpublic:Plugin01();该宏用于在具体的实现类中声明所支持的接口。将要实现的接口类型作为参数传递给该宏即可。此宏告诉Qt哪些接口被类实例了。这个宏通常用于插件的实例。该宏用于在插件项目中定义元数据信息。IID参数是接口标识符,表示插件所实现的接口类型;

m0_66203017的博客 692

53. QT插件开发--插件(动态库so)的调用加载

在linux系统中加载动态库文件,需要使用dlopen函数和dlsym函数,其中dlopen用于打开指定路径下的so库文件,并返回一个句柄,dlsym根据返回的句柄查找so文件中暴漏在外部的接口函数,并进行调用。在使用QT进行插件库的开发之后,还需要将这个插件库程序生成的so动态链接库加载到主程序框架中进行使用,才能达到主程序的模块化开发的效果。中介绍了如何在QT开发插件库,并提供外部接口调用。是so库暴漏出来的外部接口函数名称,两者一定要对应,否则会报错找不到指定的函数接口。是指定的库文件的路径。

山间点烟雨 1035

QT插件的创建及调用

创建: 新建Lib工程 新建后,将下面的文件全部删除。只留一个pro文件。 此时新增一个.h文件。Interface.h。 因为我们是要做插件,根据QT插件机制。需要一个类位接口类,所以该类里面必须有纯虚函数。IIDS为每个插件的“类似于标识符”。 Q_DECLARE_INTERFACE(name,QString).将一个字符串一个接口类绑定,作为标识。 此时,我们的接口类就定义完毕了。 下面来定义一个插件。 为工程新增一个C++工程,包含.h和.cpp。...

qq_39501474的博客 1025

在Visual Studio使用Qt插件机制进行开发

在PluginTest应用中增加一个接口用于调用插件提供的方法,此接口定义在文件中。// 1.定义一个接口集(只有纯虚函数的类)public:// 2.用宏Q_DECLARE_INTERFACE()将该接口告诉Qt元对象系统。

HXZ_CREATE的博客 1476

实战详细讲解Qt插件plugin的编写用法

qt插件开发,可以说是动态库的开发,因为调用方式类似,多熟悉一下,利用Qt框架开发很简单的。在想想这种调用过程有的熟悉,比如公司买了一堆摄像头,公司要对摄像头进行二次开发,实现自己想要的功能,集成到一套设备里去,然后在卖给用户。此时厂商肯定会提供开发文档,并给你SDK包(软件开发工具包), 包里你会发现只有头文件和一堆库文件,没有源文件,因为实现的过程是产商公司保密的,给你看还得了。所以都封装成了库的形式给你调用,如静态库或者动态库。

qq_44667165的博客 1万+

Qt插件开发源码

Qt插件开发源码 去发现同类优质开源项目:https://gitcode.com/ 简介 本资源包含了Qt插件开发所需的全部源码,主要涵盖生成插件程序和调用插件程序两部分。这些源码旨在帮助开发者更好地理解和掌握Qt插件开发技术。 内容说明 生成插件程序:这部分源码展示了如何创建一个Qt插件,包括插件的接口定义、实现以及相关资源文件。 调用插件程序:这部分源码介绍了如何在Qt应用程序中加载并...

gitblog_06700的博客 392

Qt Plugin插件开发指南(1)- 一般开发流程

插件是一种遵循一定规范的应用程序接口编写出来的程序,定位于开发实现应用软件平台不具备的功能的程序。插件宿主程序之间通过接口联系,就像硬件插卡一样,可以被随时删除,插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护。Qt提供了两种API用于创建插件:一种是高阶API,用于扩展Qt本身的功能,如自定义数据库驱动,图像格式,文本编码,自定义样式等;一种是低阶API,用于扩展Qt应用程序。本文主要是通过低阶API来创建Qt插件,并通过静态、动态两种方式来调用插件

u013441358的专栏 4386

Qt开发实战:免注册调用大漠插件DLL的完整流程(含常见错误排查)

本文详细介绍了在Qt开发中免注册调用大漠插件DLL的完整实战流程。通过分析COM接口原理,提供从环境准备、类型库生成到核心代码编写的步骤,并重点解析了免注册调用的实现方法常见错误排查方案,帮助开发者实现绿色部署,避免系统注册表污染。

purple的博客 1030
上一篇: QT主窗口与子窗口互相传值笔记
下一篇: QT scrollArea控件背景透明,但不影响子控件的方法
kashey
博客等级 码龄7年 6粉丝 11原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值