Qt 插件系统的使用和简单示例

Qt控件源码原创独家(共201个支持Qt4、Qt5、Qt6) 超过188个精美控件并持续不断迭代更新升级,种类超多,控件类型极其丰富 Qt控件源码原创独家(共201个支持Qt4、Qt5、Qt6) 阅读详情

0. 前言

Qt 有自己的插件系统, 使用插件框架开发程序, 便于扩展和管理, 插件实际上是动态库, 个人理解是与动态库的区别是有一个插件管理器, 使用相同的调用约定.

 

1. 环境

Qt 4.8.7 + win10

 

2. 功能

这个demo的功能是发送一个Message字符串到插件的函数, 并返回显示
 

3.目录

源码路径: Github下载源码地址

E:PluginApp
│  list.txt
│  PluginApp.pro
│  PluginApp.pro.user
│  
├─EchoPlugin
│      echoplugin.cpp
│      echoplugin.h
│      EchoPlugin.pro
│      main.cpp
│      
└─MainWindow
        echointerface.h
        main.cpp
        MainWindow.pro
        widget.cpp
        widget.h

可以看到, 使用了子项目开发模式, PluginApp 内有两个子项目, EchoPlugin和MainWindow

EchoPlugin: 插件子项目, 生成dll插件

MainWindow: 主窗口 , 调用插件

 

4. 用法

先不说细节, 只讲大概的思路

EchoPlugin

<1> pro中插件的相应配置

<2> 创建插件类, 实现相关的方法

MainWindow

<1> 定义插件的调用头文件, 里面是插件类的声明, 都是虚方法, 用于在创建插件对象时重载

<2> 加载插件类并使用

 

5. 源码

上部分核心代码

MainWindow子项目

echointerface.h 声明插件虚方法的头文件

#ifndef ECHOINTERFACE_H
#define ECHOINTERFACE_H

#include <QString>

class EchoInterface
{
public:
    virtual ~EchoInterface() {}
    virtual QString echo(const QString &message) = 0;
};

#define EchoInterface_lib "Example.Plugin.EchoInterface"

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(EchoInterface, EchoInterface_lib)
QT_END_NAMESPACE

#endif // ECHOINTERFACE_H

loadPlugin() 加载插件

bool Widget::loadPlugin()
{
    bool ret = true;
    //获取当前应用程序所在路径
    QDir pluginsDir(qApp->applicationDirPath());
    qDebug() << pluginsDir;

#if defined(Q_OS_WIN)
    if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
        pluginsDir.cdUp();
#elif defined(Q_OS_MAC)
    if (pluginsDir.dirName() == "MacOS")
    {
        pluginsDir.cdUp();
        pluginsDir.cdUp();
        pluginsDir.cdUp();
    }
#elif defined(Q_OS_LINUX)
    pluginsDir.cdUp();
#endif
    //切换到插件目录
    pluginsDir.cdUp();
    pluginsDir.cd("plugins");
    qDebug() << pluginsDir;

    //遍历plugins目录下所有文件
    foreach (QString fileName, pluginsDir.entryList(QDir::Files))
    {
        qDebug() << fileName;
        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));

        QObject *plugin = pluginLoader.instance();
        if (plugin)
        {
            //插件名称
            QString pluginName = plugin->metaObject()->className();
            //对插件初始化
            if(pluginName == "EchoPlugin")
            {
                echoInterface = qobject_cast<EchoInterface *>(plugin);
                if (echoInterface)
                    ret =  true;
                break;
            }
            else
            {
                ret = false;
            }
        }
    }
    return ret;
}

sendEcho 使用插件方法

void Widget::sendEcho()
{
    QString text = echoInterface->echo(lineEdit->text());
    label->setText(text);
}

 

EchoPlugin 插件子项目

echointerface.h

#ifndef ECHOPLUGIN_H
#define ECHOPLUGIN_H


#include <QObject>
#include <QtPlugin>
#include "echointerface.h"

class EchoPlugin : public QObject, public EchoInterface
{
    Q_OBJECT
    Q_INTERFACES(EchoInterface)
public:
    explicit EchoPlugin(QObject *parent = 0);
    QString echo(const QString &message);
};

#endif // ECHOPLUGIN_H

echointerface.cpp

#include "echoplugin.h"

EchoPlugin::EchoPlugin(QObject *parent) :
    QObject(parent)
{
}

QString EchoPlugin::echo(const QString &message)
{
    return message;
}

Q_EXPORT_PLUGIN2(EchoPlugin, EchoPlugin)

 

Qt读写Excel文件的各种常用的方法 https://wiki.qt.io/Handling_Microsoft_Excel_file_format 里面总结了Qt读写Excel文件的各种常用的方法,包括一些第三方的插件。 通常,在windos系统操作Excel上,QT有两种方式,一是通过COM组件,二是通过QODBC(数据库的方式)。 网上推荐是使用QAxObject通过COM组件读取,QODBC读取100MB的Excel文件的时候需要十几分钟,因为太慢,这种方法舍弃。 但是这个用法有问题,当机器没有安装Office的时候,是不能调用 阅读详情

相关推荐

Qt自己编写keyboad虚拟键盘

由于项目中有需要用到虚拟键盘,首先想到的是系统自带的,笔者是Ubuntu16+Qt5.9。 1.系统虚拟键盘的优缺点: 优点:直接可以脚本调起,功能完善,稳定。外观完美。 缺点:定制麻烦(详情看onboard帮助文档,英文),要想像手机那样用时自动显示,不用时自动隐藏,需要先设置系统的输入法,而且需要GNome的辅助功能支持。 2.Qt5已经有自带输入法了。Qt安装的时候就有一个virtu...

evil_119的专栏 1万+

Qt5的插件机制(7)--插件开发示例代码(Lower-level API)

插件代码 接口类头文件 MyPluginInterface.h #ifndef INTERFACES_H #define INTERFACES_H #include #define QtPluginDemo_iid "org.qt-project.Qt.PluginDemo" class MyPluginInterface { public: virtual int add(int,

NewThinker_wei 的专栏 1万+

Qt插件系统:简洁实例与编程指南

Qt插件系统允许开发人员将应用程序功能模块化为插件,这些插件可以在运行时动态加载和卸载,从而实现应用程序的灵活性和可扩展性。Qt是一个跨平台的C++应用程序开发框架,其中的插件系统提供了一种灵活且可扩展的方式,用于在运行时加载、卸载和管理动态库。请根据自己的需求进行相应的修改和扩展。下面是一个简单的示例,展示了如何使用Qt插件系统来创建一个简单的插件,以及如何在主应用程序中加载和使用该插件。以下是一个简单的示例,展示了如何使用Qt插件系统来创建一个简单的插件,以及如何在主应用程序中加载和使用该插件。

2301_79326254的博客 295

基于Qt插件机制扩展应用程序示例

基于Qt插件机制扩展应用程序示例

lzqd1314的博客 2238

Qt基础之二十四:深入理解插件系统

Qt提供了两类API来创建插件:☆high-level API用于创建Qt自身的扩展,比如说自定义数据库驱动、图像格式、文本编码、样式,等等☆low-level API用于扩展Qt应用程序如果你想为Qt Designer提供插件,可以参考Qt Assistant:Qt Designer Manual。

草上爬的博客 8573

CTK插件框架的基本原理和Qt

接着,我们需要将其打包为一个动态库。而CTK插件框架是一个基于Qt的开源框架,它提供了一种简单、灵活、可扩展的方式来管理应用程序的插件。在使用CTK插件框架时,我们需要将应用程序和插件分开编写。应用程序定义一些接口或抽象类,而插件则实现这些接口或抽象类,然后将其打包为动态库。CTK插件框架为我们提供了一种简单、灵活、可扩展的方式来管理应用程序的插件,让我们的开发工作变得更加高效。在CTK插件框架中,还有许多其他特性,例如自动转换和依赖项解析等。下面,我们通过一个简单的示例来说明如何使用CTK插件框架。

HackLogic的博客 650

QtCreator插件开发(一)——QtCreator插件实例

本文将使用QtCreator-2.8.1版本进行插件开发,由于QtCreator-2.8.1的插件机制进行了部分更改,因此将根据QtCreator-2.8.1插件机制为基础撰写本文。 一、QtCreator源码编译 1、构建目录的创建 QtCreator工程的源码编译推荐在独立工作目录进行,避免源码被污染。在QtCreator工程的根目录下创建build目录。 2、生成工程MakeFile文件 在build目录下使用命令行运行: qmake ../qtcreator.pro -recursi.

天山老妖 5514

qt插件样例,使用自带的方式实现

按照该网址(http://blog.youkuaiyun.com/anobodykey/article/details/40430137)写的代码,本来想0分上传的,csdn竟然最少1个资源分,没法了。 该文章讲述了一个QT插件开发的简单应用样例:只写了一个插件,该插件用于提取字符串中的数字,通过该样例能够初步了解QT插件开发的代码结构,通过接口、QPluginLoader能简单的应用插件开始应用,后面我会开发一个完整的插件应用出来。

Qt-插件创建

跟前面的章节一样,了解一下,会使用qt的插件 Qt插件(Qt Plugin)就是一个共享库(dll文件),可以使用它进行功能的扩展。 Qt中提供了两种API来创建插件: 用来扩展Qt本身的高级API,如自定义数据库驱动,图片格式、文本编码和自定义风格等; 用来扩展Qt应用程序的低级API。 如果要写一个插件来扩展Qt本身,那么可以子类化合适的插件基类,然后重写一些函数并添加一个宏。 可以通过在帮助中查看How to Create Qt Plugins关键字来了解本节的内容,这里还可以查看Qt提供的插件基

Half-up的博客 2891

ZYNQ Linux环境下PS端I2C驱动OV5640摄像头全流程解析

本文详细解析了在ZYNQ Linux环境下,通过PS端I2C驱动OV5640摄像头的完整流程。内容涵盖从Vivado硬件配置、PetaLinux系统构建、设备树节点添加,到用户空间I2C编程与寄存器配置实战,并提供了关键的调试技巧与常见问题排查方法,帮助开发者快速实现嵌入式视觉应用的传感器配置。

vulkan6gpu的博客 853

光猫改桥接后,一根网线搞定IPTV和上网的保姆级教程(附VLAN配置避坑点)

本文详细介绍了光猫改桥接后如何通过单线复用技术实现IPTV和上网功能共存。从VLAN配置原理到具体操作步骤,包括光猫超级管理员权限获取、VLAN绑定设置及路由器IPTV功能配置,提供了全面的保姆级教程。特别针对常见问题如IPTV信号丢失、网速下降等给出了实用解决方案,帮助用户轻松避坑。

weixin_29927965的博客 1745

Qt插件使用

对于一个大型软件系统来说,实现plugin是一件很美妙的事情,一个成功的plugin系统可以使软件增色不少。Plugin最大的功能是在一定程度内提高了软件的灵活度和可扩展性。一个设计精良的server软件plugin系统甚至在server程序不退出的情况下可以调用新加入的plugin,实现不间断...

tt_137062185的专栏 1033

STM32F103C8T6+HX711实战:从零打造智能体重秤(附OLED显示与语音播报)

本文详细介绍了基于STM32F103C8T6微控制器和HX711称重模块,从零构建智能体重秤的完整实战教程。内容涵盖硬件选型、系统架构、驱动编写、数据滤波校准算法,并实现了OLED显示与语音播报功能。该项目是嵌入式学习的综合性实践,尤其适合作为毕业设计课题,帮助开发者掌握传感器应用、数据处理及人机交互等核心技能。

weixin_28285943的博客 517

Qt中实现工厂模式

在Qt中实现工厂模式可以通过多种方式,具体选择取决于需求和场景。

enyp80的博客 710

SSTI模板注入及绕过姿势(基于Python-Jinja2)

http://xmctf.top:8962/?name={{%22%22[%22\x5f\x5fclass\x5f\x5f%22]["\x5F\x5Fbase\x5F\x5F"]["\x5F\x5Fsubclasses\x5F\x5F"]()[233]["\x5F\x5Finit\x5F\x5F"]["\x5F\x5Fglobals\x5F\x5F"]["\x5F\x5Fbuiltins\x5F\x5F"]['eval']("\x5F\x5Fimport\x5F\x5F('os'))")}}

Y4tacker的博客 1万+

【谷粒商城】分布式事务与下单

=购物车== 构建gulimall-cart,复制静态资源到nginx,修改网关 购物车分为离线购物车和登录购物车 离线购物车重启浏览器了也还有 1、购物车需求 特点:读多写少,放入数据库并不合适 登录状态:登录购物车 放入数据库 mongodb 放入redis(采用) 登录以后,将离线购物车里合并后清空离线购物车 未登录状态:离线购物车 放入localstorage浏览器的技术 cookie WebSQL 放入redis(采用) 浏览器重启后还在 2、购物车VO (1) 数据结构分析

努力充实,远方可期 1万+

基于QPluginLoader的简单插件系统

插件系统分为两部分 第一部分:主程序,实现系统的 通用逻辑,加载定制化的插件 第二部分:插件,实现定制化的功能。 系统的升级即可通过升级不同的插件即可完成整个系统的升级 Qt插件系统中 我们使用 QPluginLoader 这个类去实现,主系统自动化加载插件。 1.定义好系统的纯虚类 eg: #ifndef FUNABSTRSCT_H #define FUNABSTRSCT_H #include <QObject> class FunAbstrsct { public: vir

baidu_40243760的博客 696

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 温度传感器DS18B20

2.1 理论分析 2.1.1概述 DS18B20 是 DALLAS 最新单线数字温度传感器,新的"一线器件"体积更小、适用电压更宽、更经济。Dallas 半导体公司的数字化温度传感器 DS1820 是世界上第一片支持 "一线总线"接口的温度传感器。 DS18B20采用的单总线协议,也就是只需占用主机一个I/O口,无需其他外围电路,直接将环境温度转换为数字信号,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。另外,以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量

不问归期的博客 8304

获取VS Addin Qt插件

很多人使用QT语言,因为封装的很好。而VS又是大家常用的工具。 大家都知道VS有QT的插件,也就是VS addin,但是一般又不知道去哪里下载。 下面我就说一下怎么获取vs addin。 方法/步骤 首先打开百度,输入qt downloads,点击搜索,在列表第一位就可以看到下图,点击进入官网: 在这个页面,选择official

Allure Love的博客 903

2024 大型集团人力资源数字化转型业务蓝图规划及实施路径规划方案【附全文阅读】

摘要:本方案针对大型企业人力资源数字化转型需求,重点解决组织协同弱、薪酬绩效管控难等痛点。通过构建"6项能力+8大流程+4大系统"框架,分三阶段(2024-2026年)实施7大项目,包括e-HR系统更换、员工服务平台搭建等核心场景。方案优先推进基础系统改造(2024年),再完善绩效管理和数据分析(2025年),最后落地人才发展等进阶模块(2026年),实现与OA、ERP系统的数据集成,全面提升HR运营效率和员工体验。文末提供的优先级清单明确了10个数字化场景的实施顺序及预期价值。

cdfunlove的博客 1345

华为OD统一考试 - 模拟消息队列(Java & Python& JS & C++ & C )

让我们来模拟一个消息队列的运作,有一个发布者和若干消费者,发布者会在给定的时刻向消息队列发送消息,

算法大师! 3518

Qt介绍---QPA(Qt Platform Abstraction)

来源 Qt是一个夸平台的库(其一直宣称“Qt everywhere”),但是Qt底层不是夸平台的。 比如:Qt中Gui部件的核心类QWidget,该类除了qwidget.h 和 qwidget.cpp两个原文件外,还有 kernel/qwidget_mac.mm kernel/qwidget_qws.cpp kernel/qwidget_win.cpp kernel/qwi

xi_gua_gua的博客 4166

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Qt的sqlite3加密插件:为您的Qt应用增强数据库安全性

Qt的sqlite3加密插件:为您的Qt应用增强数据库安全性 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 Qt环境下的sqlite3加密,提升Qt应用程序数据库安全性。 项目介绍 在软件开发领域,数据库安全性一直是开发者关注的焦点。Qt的sqlite3加密插件应运而生,为Qt环境下运行的SQLite数据库提供了一层坚实的加密保护。此插件专为Qt5.9.5版...

gitblog_06703的博客 396

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

qt 增加的翻译没有作用上_Qt语言翻译工具的使用 及 QT-Linguist国际化的简单实现...

通过使用Qt Linguist工具时,可以有两种方式进行下一步操作(Windows操作系统)。首先说明第一种,在一个软件系统中存在*.pro的工程文件,因而我们可以借此通过采用命令行的形式生成最终所需要的或更新过的*.qm文件,但前提是,如果是更新*.ts和*.qm文件,则须将最后生成的*.qm文件放到系统能够调用得到的文件中去,否则,打开软件查看,结果还和上一次一样,并没有更新自己刚刚翻译过的内...

weixin_39609483的博客 610

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Qt Andriod 在Windows系统下编译和添加动态库(二)

日期 作者 版本 说明 2020.12.21 Sleep Tiger V1.0 Release as V1.0 文章目录前言一、怎么生成编译生成动态库?插件开发1.设计接口文件2.配置工程文件3.实现接口的类4.对应实现类的源文件二、打包进apk三、插件调用总结 前言 提示:上篇文章讲了一下Qt for android 编译简单的动态库,但实际的过程中,也有很多调用了其他功能模块或者源码,这就需要我们使用插件的形式去编译生成动态库。 例如:我在实际项目中,使用了modbus通讯方式...

qq_36349156的博客 899

qt学习(一) qt安装

QT5现在安装已经方便了许多 相比QT4 可以一路点击到底 无需额外的太多的操作. http://download.qt.io/official_releases/ 下载 1 windows下可以选择 将qt作为VC插件安装 首先根据系统和vs的版本选择 qt的安装版本 选择qt-opensource-windows-x86-msvc2013-5.5.1.exe 一路默认安装 ...

weixin_30692143的博客 126
上一篇: Qt QLabel显示图片 动画 富文本
下一篇: STM32-01基于HAL库(CubeMX+MDK+Proteus)仿真开发环境搭建(LED点亮测试实例)
Empty_Android
博客等级 码龄10年 98粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值