Qt插件创建及加载

Qt实现自定义控件能够以插件的方式加载到Qt设计师 在Qt设计师中使用自定义窗口部件之前,我们必须让Qt设计师知道他们的存在。常规方法有俩种改进法和插件法。 阅读详情

点击上方蓝字可直接关注公众号,方便下次阅读。

在开展新内容前,先简单回顾下上篇文章的内容。

上次我们是直接在Qt 自带的例子基础上做的修改,直接运行。我们的插件需要继承Qt 的Style插件,之后重新实现自己想要实现的部分。在主程序中直接通过QApplication::setStyle进行调用。

 

下面开展我们本次的内容,官方文档说明

 

通过插件不仅可以扩展Qt本身,而且可以扩展Qt应用程序。 这要求应用程序使用QPluginLoader检测和加载插件。 在这种情况下,插件可以提供任意功能,并且不仅限于数据库驱动程序,图像格式,文本编解码器,样式以及扩展Qt功能的其他类型的插件。

 

1. 通过插件使应用程序可扩展涉及以下步骤:

 

①定义一组用于与插件对话的接口(仅具有纯虚函数的类)。

②使用Q_DECLARE_INTERFACE()宏向Qt的元对象系统声明该接口。

③在应用程序中使用QPluginLoader加载插件。

④使用qobject_cast()测试插件是否实现了给定的接口。

 

 

2. 编写一个插件的步骤:

 

①声明一个插件类,该类继承自QObject和该插件要提供的接口。

②使用Q_INTERFACES()宏告诉Qt的元对象系统有关接口的信息。

③使用Q_PLUGIN_METADATA()宏导出插件。

④使用合适的.pro文件构建插件。

 

上面的步骤看不大懂?没关系,下面我们通过程序来逐步分解上面的步骤

1. 创建子工程Qt应用程序

在Qt新建工程时,选择创建子工程,如下图。

按照提示完成子工程的创建,我的工程名称是MyFirstPlugin

创建完成后工程是空的,选中工程后鼠标右键,【New SubProject...】,如图。之后添加的子工程就像平时创建带有UI的工程一样,我选择的是继承QWidget。

此时编译运行的话会显示一个为空的QWidget窗体。创建成功后大概向下面的样子

2. 通过插件使应用程序可以被扩展

 

【应用程序扩展插件步骤】

①编写仅具有纯虚函数的类

选中文件夹Headers后右键,选择【Add New...】,选择【C++ Header File】,我的名称是 abstractinterface.h。由于我想创建的插件是带有UI的,所以类型是QWidget 。

#include <QObject>class QWidget;class AbstractInterface{public:    virtual ~AbstractInterface() {}    virtual QWidget *createPluginWidget(QWidget *parent) = 0;};

【应用程序扩展插件步骤】

②使用Q_DECLARE_INTERFACE()宏向Qt的元对象系统声明该接口。

里面字符串内容是声明一个独一无二的属于你的iid,我的是“欢迎关注公众号”。

#define AbstractInterface_iid "Welcome to pay attention to the public number"

Q_DECLARE_INTERFACE(AbstractInterface, AbstractInterface_iid)

 

此时通过插件使应用程序可以被扩展的前两步就完成了,后面两步之后在宿主程序中加载插件时再介绍。此时你的工程看起来是这个样子:

3. 再添加一个子工程用于编写插件

①再次添加一个子工程

选中工程【MyFirstPlugin】后鼠标右键,【New SubProject...】。之后添加的子工程就像平时创建带有UI的工程一样,我选择的是继承QWidget。我的名称是PluginWidget

 

 

②修改PluginWidget

新创建的PluginWidget包含有main.cpp,将它删除。

修改PluginWidget.peo,将 TEMPLATE = app 改为TEMPLATE = lib;添加CONFIG   += plugin

 

【插件编写步骤】  

③声明一个插件类,该类继承自QObject和该插件要提供的接口

之后添加一个继承QObject的类,我的名称是MyFirstPlugin。该类就是插件类。

此时你的工程看起来是这个样子:

这步还没结束,还要再继承AbstractInterface类,但是在myfirstplugin.h中无法直接包含abstractinterface.h,这时需要修改PluginWidget.pro。根据创建的目录添加INCLUDEPATH    += ../MainWidget,这时就可以include abstractinterface.h了。

顺便说下,通过拆分不同的.pro也可以解耦程序,以后根据具体情况再和大家分享。

 

【插件编写步骤】 

④使用Q_INTERFACES()宏告诉Qt的元对象系统有关接口的信息

Q_INTERFACES(AbstractInterface)

 

【插件编写步骤】 

⑤使用Q_PLUGIN_METADATA ()宏导出插件

Q_PLUGIN_METADATA(IID "Welcome to pay attention to the public number." FILE "myfirstplugin.json")

注意下myfirstplugin.json,这是我们echoplugin中直接改名复制的,这个需要有。echoplugin是Qt自带的插件例程。

插件编写最后一步是实现createPluginWidget(QWidget *parent) 

QWidget *MyFirstPlugin::createPluginWidget(QWidget *parent){    PluginWidget *pluginWidget = new PluginWidget(parent);    return pluginWidget;}

PluginWidget是插件逻辑实现的子工程,该工程中我仅在UI中添加了两个label。

至此,插件编写完成。

此时运行工程会生成一个插件,如图:

4. 宿主程序加载插件

①在应用程序中使用QPluginLoader()加载插件

宿主程序中有一个AbstractInterface对象

遍历PluginWidget目录下的文件,如果实例化成功则使用qobject_cast()测试插件是否实现了给定的接口。【应用程序扩展插件步骤的③和④】

 foreach(QString fileName, pluginsDir.entryList(QDir::Files)) {        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));        QObject *plugin = pluginLoader.instance();
        if(plugin)        {            m_pluginInterface = qobject_cast<AbstractInterface *>(plugin);            if(m_pluginInterface)            {                m_pluginInterface->createPluginWidget(ui->pluginWidget);                ok = true;            }        }    }

在主UI中添加了一个Widget(ui->pluginWidget)和一个测试按钮。最后效果如下:

总结:

插件创建完以及加载后,整个流程就像官网描述的一样。对没有基础的同志来讲还是有一定难度,所以我就又自己搭建了一遍。

过程中涉及到了Qt的子工程、qmake的使用等。

Qt的插件从C++的角度来讲就是C++纯虚函数的应用,需要规定接口,由插件去实现,宿主程序只负责调用。

最后,如需整体工程的同志可在公众号后台留言:

用于扩展Qt自身的插件(下) QtCreator的设计器中加载自定义的插件。 阅读详情

相关推荐

简单的创建qt插件流程

简单的创建qt插件流程1.创建插件类。2.创建.h头文件也是接口文件,声明类,写需要的方法,不用实现。3.插件类的头文件需要继承接口文件类和QObject类,声明继承的那个接口。继承后需要实现接口的全部方法。4.编译生成dll文件。5.加载插件,验证是否成功。 1.创建插件类。 1.打开QT,选择library->C++library->确认。 2.输入名称,下一步。 3.选择类型为qtplugin,类名自己输的,我的为CustomPlugin,点击一步。 4.生成界面。 2.创建.h头

qq_43627433的博客 1498

Qt--QPlugin插件

自定义插件时,要先创建一个接口,作为插件类的基类。因为插件存储在一个dll中,因此可以动态的加载。创建一个插件包含以下几步:①定义一个接口类(只有纯虚函数的抽象类)②使用Q_DECLARE_INTERFACE()宏在Qt的元对象系统中注册该接口③再定义一个插件类,必须继承自QObject类和上面创建的接口类,且需先继承QObject④在插件类中使用Q_INTERFACE()宏在Qt的元对象系统中注册该接口⑤使用Q_PLUGIN_METADATa()宏导出该插件。

SNAKEpc12138的博客 2229

上位机学习:Qt 动态加载插件

本文探讨了Qt框架中的动态加载插件,阐述了Qt插件机制的工作原理、插件的创建与使用方法,并通过实际案例展示了其在项目中的应用。

qq_43423786的博客 566

Qt插件开发总结1--插件的创建及使用

文章目录一、插件二、插件和动态库的区别三、Qt中的插件四、Qt插件开发--程序结构五、Qt插件开发--主程序部分开发流程六、Qt插件开发--插件程序部分开发流程七、实例编写7.1、主程序部分7.2、插件程序部分八、插件使用 一、插件 插件是一种(遵循一定规范的应用程序接口编写出来的)程序,定位于开发实现应用软件平台不具备的功能的程序。 插件必须依赖于应用程序才能发挥自身功能,仅靠插件是无法正常运行的;相反地,应用程序并不需要依赖插件就可以运行,这样一来,插件就可以加载到应用程序上并且动态更新而不会对应用诚信

贝勒里恩的博客 1万+

用于扩展Qt本身的插件(上)

默认是选择包含项目的,需手动勾选创建代码框架,会生成对应的下图中所示的系列文件名,此时可在图标文件项点击后面的浏览按钮选择自己要添加的图标图片。后面的步骤就不用说了,项目名为StyleWindow,路径采用默认的就行,基类为QWidget,采用默认声的Widget就行,不要勾选ui,该项目不用ui界面,一路操作,直到完成。2. 扩展Qt自身,同时需要在QtCreator的设计器中加载,类似于自定义控件,可像Qt的基本控件那般在设计器中直接展示,拖拽使用,具有属性,信号槽等。之后点击下一步按钮。

肩上风骋的博客 1395

Qt自定义插件设计与加载过程

描述了Qt中自定义插件的书写与加载过程,可以再Qt creator中加载与使用自定义插件

Qt之插件项目的创建及使用步骤(详细步骤)

本文为Qt之QPluginLoader使用插件子项目及插件间通信(简易框架)(含部分源码+注释)的续章(该文主要针对插件的理解及使用),本章为插件的详细创建步骤。本文详解了插件的创建及相关项目使用的步骤。插件模式主应用于大型项目中,通常一个大功能模块代表一个插件,工作中会时常遇到这种模式存在。友情提示——哪里看不懂可私哦,让我们一起互相进步吧注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。注:如有侵权,请联系作者删除。

lw的博客 3541

STK传感器约束设置保姆级教程:从方位角到传播延迟,手把手教你避开新手常见坑

本文详细解析了STK传感器约束设置的关键技巧,涵盖方位角、仰角、高度及传播延迟等核心参数。通过实战案例和代码示例,指导用户避开常见误区,优化卫星通信和航天任务仿真精度,特别适合STK新手和需要提升传感器配置效率的工程师。

weixin_33701294的博客 392

Qt插件热加载-QPluginLoader实现

上一篇C++消息框架-基于sigslot文章中我们讲述了使用sigslot信号槽实现自己的消息框架,这是一个比较粗糙,而且小的框架。当我们的程序逐渐变大时,我们可能就会考虑功能插件化,或者支持某些模块动态加载和卸载。 功能动态加载,也就是我们平时所说的插件化,插件支持热插拔。 之前工作中,刚好接触过这一块的内容。下面是一个Qt加载dll的方式,当我们把dll加载上以后,可以尝试转化为Plugi...

weixin_34293911的博客 1016

gem5 prefetcher

最近在gem5上做预取实验,添加自己的预取算法,这里采用hardware stream prefetcher , 修改了几个bug才给实验调试通过,发文记录下实验过程。 gem5上添加自己的预取算法步骤: (1)路径gem5-master/configs/common/Caches.py下,开启预取:class L1Cache(Cache): assoc = 2 tag_late

编程邦 3845

Altium Designer 18 将Gerber文件逆向转换成PCB(详细记录)

自己看了网上的教程,弄了很久,估计还有不足的地方,但是先把思路理一理(初学AD) 同时遇到了许多问题: 不是AD导出的Gerber估计不能自动识别层 要自己设置层顺序 要有钻孔文件数据制作NC工具(我也不懂是怎么说,就是size尺寸的) 这里记录一下,以防忘记。 正常顺序: 1.新建CAM 2.导入Gerber,选择CAM文件夹下的所有文件导入 3.设置层属性和物理顺序 4.设置NC工具 5.提取网络表 ...

lb_monkey的博客 1万+

Qt创建插件加载插件以及插件与主程序之间通信

1.Qt 创建插件 这几步就把一个插件创建好了,但是是个空的没有东西,我们加一个窗口类 form.h #ifndef FORM_H #define FORM_H #include <QWidget> namespace Ui { class Form; } class Form : public QWidget { Q_OBJECT public: ex...

shenmingyi.blog.youkuaiyun.com 7077

高通camera open代码流程(hal到kernel)

内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下...

oxoo123的专栏 4276

qt 插件的创建与加载

qt 插件的创建与加载

ckg3824278的博客 612

告别玄学调试:用STM32CubeMX和逻辑分析仪搞定DP83848的RMII与SMI接口

本文详细介绍了如何使用STM32CubeMX和逻辑分析仪调试DP83848的RMII与SMI接口,帮助开发者超越表象,直接观察底层通信波形。通过实战案例和高级调试技巧,解决常见问题如时钟偏移、信号完整性等,提升网络接口的稳定性和可靠性。

weixin_30752699的博客 299

实战指南:如何用Elasticsearch+Milvus搭建十亿级多模态搜索系统(含性能调优)

本文详细介绍了如何利用Elasticsearch和Milvus构建十亿级多模态搜索系统,包括架构设计、性能调优和实战部署。通过混合架构实现高效文本检索与向量相似度计算,显著提升查询性能与扩展能力,适用于大规模多模态数据处理场景。

x8y9z0的博客 1172

qt 使用 cmake 创建插件(QPluginLoader 加载插件编译文件)

qt 使用 cmake 创建插件(QPluginLoader 加载插件编译文件)

u011442415的博客 3203

【教程】ENVI主成分分析详解

主成分分析(PCA)是一种统计方法,简而言之就是用几种特性去描述事物。每个事物都可以用不同的特性去进行表达,但这些特性一般而言是存在相互的融合和冗余,而用主成分分析方法将这些特性进行转换成不相关的新特性。 在ENVI软件中共提供了三种主成分分析方式分别为:(1)Forward PCA Rotation Existing Statistics(2)Forward PCA Rotation New Statistics and Rotate(3)Inverse PCA Rotati...

YW_remote的博客 1万+

qt中charts的example中有哪些_Qt插件创建及加载

全网最详细的Qt插件搭建及加载步骤在开展新内容前,先简单回顾下上篇文章的内容。上次我们是直接在Qt 自带的例子基础上做的修改,直接运行。我们的插件需要继承Qt 的Style插件,之后重新实现自己想要实现的部分。在主程序中直接通过QApplication::setStyle进行调用。下面开展我们本次的内容,官方文档说明通过插件不仅可以扩展Qt本身,而且可以扩展Qt应用程序。 这要求应用程序使用QPl...

weixin_39735247的博客 192

【华为OD机试真题】459、小扇和小船的数字游戏、数字游戏 | 机试真题+思路参考+代码解析(CD卷)(C++、Java、Py)

### 🎃题目描述 >小扇和小船今天又玩起来了数字游戏,小船给小扇一个正整数 n(1  现在求 m 的最小值

KJ.JK 1719

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

VisualStudio&QT 动态库、静态库以及QT Plugin插件创建和加载方法

一、动态库创建以及静态加载方法 1. 创建动态库 (1)编写好.h和.cpp文件 (2)项目->属性->配置属性->常规->配置类型(动态库.dll) 2. 动态库静态加载方法 (1)包含编写好的.h文件 (2)pragma comment(lib, "../../../../")后面问lib库所在的路径 #pragma comment(lib, "....

weixin_40593924的博客 2322

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Qt插件机制介绍及实现

创建应用程序主窗口。

2401_87555477的博客 965

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

8.2 如何创建与加载插件

插件是一个共享库(

qq_35223555的博客 479

Qt插件系统

例如,如果您想编写一个自定义的QStyle子类并让Qt应用程序动态加载它,那么您将使用高级的API。由于高级API构建在低级API之上,因此有些问题对两者都是通用的。如果你想为Qt Designer提供插件,请参阅Qt Designer模块文档。

qq_32640443的博客 2007

使用QGenericPlugin和QPluginLoader创建和加载插件

根据官方文档介绍,Qt插件开发允许你通过动态加载和使用插件来扩展应用程序的功能。在应用程序中,我们可以事先定义好接口,把接口的具体实现交给插件去完成。这样做的好处是应用程序和插件可以分别开发,降低代码耦合度,实现代码模块化设计。当接口的具体实现需要修改时,我们不必重写编译应用程序,只要把修改编译后的插件dll文件拷贝到应用程序指定目录,即可完成功能升级。

m0_46442410的博客 2459

VS2017加载QT插件提示“未能正确加载VSIX包”的问题

问题现象: 安装VS QT 插件之后,提示未能正确加载VSIX包。无法创建QT的工程。 未能正确加载VSIX包 在安装了QT 5.12.2 以及qt-vsaddin-msvc2017-2.3.2.vsix后出现的Microsoft VS 无法加载QT的问题: 未能正确加载VSIX包 1.根据错误信息检查Roaming文件,发现是找不到Microsoft.VisualStudio.Th...

guanguanboy的专栏 5793
上一篇: Qt插件入门——使用插件扩展Qt自身
下一篇: Qt TreeWidget 控件(一)
Pou光明
博客等级 码龄12年 3701粉丝 398原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值