详解如何建立Qt插件学习教程

2023-10-30

如何建立Qt插件学习教程是本文要介绍的内容,主要是来了解QT插件的应用,如何来建立,文中有详解,具体内容的实现来看详解。

QT提供2个API来建立插件

1、高层API扩展QT库。例如定制的数据库驱动,图像格式,字符编码,custom styles

2、底层API扩展QT应用程序

例如,如果想写自定义QStyle的子类,并让应用程序动态加载,需要使用高层API函数

因为高层API在底层API基础上构造,两者需要注意一些问题。

如果需要提供给QT Designeder插件,请参考QtDesigner模型文档

高层API

利用继承特定的基类来实现插件,需要实现其中的一些函数,并增加一个宏

QT中有不少插件的基类可供使用,继承的插件默认保存在标准插件目录的子目录下,否则Qt会找不到。

设计一个style类名为MyStyle的插件

文件mystyleplugin.h:

 
 
  1. class MyStylePlugin : public QStylePlugin  
  2. {  
  3. public:  
  4. QStringList keys() const;    //返回此插件能够使用的style名称列表。  
  5. QStyle *create(const QString &key);//根据传入的style名称,返回style。  
  6. };  
  7.  
  8. mystyleplugin.cpp  
  9. #include "mystyleplugin.h"  
  10.  
  11. QStringList MyStylePlugin::keys() const  
  12. {  
  13. return QStringList() << "MyStyle";  
  14. }  
  15.  
  16. QStyle *MyStylePlugin::create(const QString &key)  
  17. {  
  18. if (key.toLower() == "mystyle")  
  19. return new MyStyle;  
  20. return 0;  
  21. }  
  22.  
  23. Q_EXPORT_PLUGIN2(pnp_mystyleplugin, MyStylePlugin) 

风格实现

文件mystyle.h:

 
 
  1. class MyStyle : public QWindowsStyle  
  2. {  
  3. Q_OBJECT  
  4.  
  5. public:  
  6. MyStyle() {};  
  7.  
  8. void polish(QPalette &palette);  
  9. }; 

继承自QWindowsStyle

风格实现

 
 
  1. void MyStyle::polish(QPalette &palette)  
  2. {  
  3. palette.setBrush(QPalette::Button, Qt::red);  

(注意其中实现的大小写方式)。

实现数据库驱动,图像格式、文本编码和大多数其他插件类型时,一般不需要建立对象,Qt会找到他们并建立他们的对象。Style是一个特例,因为程序中科能会这样调用:

 
 
  1. QApplication::setStyle(QStyleFactory::create("MyStyle")); 

main.c文件:

 
 
  1. int main(int argv, char *args[])  
  2. {  
  3. QApplication app(argv, args);//QT此时加载了插件  
  4. QApplication::setStyle(QStyleFactory::create("simplestyle"));  
  5.  
  6. StyleWindow window;  
  7. window.resize(200, 50);  
  8. window.show();  
  9.  
  10. return app.exec();  

工程文件:

 
 
  1. TEMPLATE    = lib 
  2. CONFIG     += plugin  
  3. HEADERS     = simplestyle.h \  
  4. simplestyleplugin.h  
  5. SOURCES     = simplestyle.cpp \  
  6. simplestyleplugin.cpp  
  7. TARGET      = simplestyleplugin 

注意,插件需要设置TEMPLATE,因为我们需要的是共享库而不是执行程序。同时必须设置CONFIG。需要将此插件保存到style文件夹(应用程序所在的文件夹)。这样应用程序就能够检测得到。

底层API:没有详细研究

不管是QT本身还是QT应用程序都可以通过插件扩展。这需要应用程序检测并通过QPluginLoader进行加载。因此,插件可以提供任意功能,而不仅限于上面说的插件。

插件扩展应用包括4个步骤

1、定义插件的接口集(实际上是只有虚函数的一个类)

2、Q_DECLARE_INTERFACE宏告诉meta-object系统此接口的存在。

3、利用QPluginLoader加载插件

4、使用qobject_cast()函数测试插件实现的借口

插件编码的4个步骤

1、继承QObject定义一个插件类,并定义插件需要的接口

2、使用Q_InterFaces()宏告诉meta-object系统接口的存在

3、使用Q_EXPORT_PLUGIN2()宏输出插件

4、编译工程

例如下面例子:

接口类:

 
 
  1. class FilterInterface    //只有虚函数的类  
  2. {  
  3. public:  
  4. virtual ~FilterInterface() {}  
  5.  
  6. virtual QStringList filters() const = 0;  
  7. virtual QImage filterImage(const QString &filter, const QImage &image,  
  8. QWidget *parent) = 0;  
  9. }; 

插件类,实现接口

 
 
  1. #include <QObject> 
  2. #include <QStringList> 
  3. #include <QImage> 
  4.  
  5. #include <plugandpaint/interfaces.h> 
  6.  
  7. class ExtraFiltersPlugin : public QObject, public FilterInterface  
  8. {  
  9. Q_OBJECT  
  10. Q_INTERFACES(FilterInterface)  
  11.  
  12. public:  
  13. QStringList filters() const;  
  14. QImage filterImage(const QString &filter, const QImage &image,  
  15. QWidget *parent);  
  16. }; 

定位插件

QT应用程序自动加载插件,因为插件存在标准插件的子目录中

开发过程中,插件的目录在QTDIR/plugins中(QDIR是QT安装的目录)。如果希望应用程序使用或不使用标准插件,安装会得到希望安装插件的路径,并保存路径(例如应用程序使用QSettings在启动时读取它)

应用程序可以通过QCoreApplication:addLibraryPath是插件对于应用程序可见,注意,最终的路径不能改变。

如果希望插件可被加载,一种方法是在应用程序的所在目录的子目录下保存此插件。如果想发布QT自带的任何插件,需要拷贝plugins的子目录到应用程序的根目录下。(而不是包含插件的目录)

静态插件

一般的方法是将插件做成动态库和应用程序一块发布。插件动态检测和加载。

应用程序可以静态链接。假如编译的是静态的QT库,那么静态插件就是唯一的选择了。使用静态插件可以降低错误概率。但是缺点是修改插件需要重新编译整个应用程序。

QT提供一些静态的插件:

为了静态链接插件,需要在程序中使用Q_IMPORT_PLUGIN宏,需要在编译时使用QTPLUGIN参数。例如,在main.cpp中

 
 
  1. #include <QApplication> 
  2. #include <QtPlugin> 
  3.  
  4. Q_IMPORT_PLUGIN(qjpeg)  
  5. Q_IMPORT_PLUGIN(qgif)  
  6. Q_IMPORT_PLUGIN(qkrcodecs)  
  7.  
  8. int main(int argc, char *argv[])  
  9. {  
  10. QApplication app(argc, argv);  
  11. ...  
  12. return app.exec();  

工程文件中

 
 
  1. QTPLUGIN     += qjpeg \  
  2. qgif \  
  3. qkrcodecs 

小结:详解如何建立Qt插件学习教程的内容介绍完了,希望通过本文的学习能对你有所帮助!



FROM: http://mobile.51cto.com/symbian-288698.htm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解如何建立Qt插件学习教程 的相关文章

  • 推荐一款提高工作效率的屏幕扩展软件—Splashtop Wired XDisplay

    一 导读 使用Splashtop Wired XDisplay让闲置的手机平板成为电脑的第二块屏幕Splashtop Wired XDisplay 好文章 记得 收藏 点赞 关注 如果你和我一样抱怨着显示器太小 Idea编程软件占用了太多工
  • 03 ZooKeeper底层原理剖析与命令实战

    文章目录 03 ZooKeeper底层原理剖析与命令实战 1 Znode数据结构 1 1 目录结构 1 2 节点类型 2 ZK客户端命令行操作 3 ZooKeeper会话 4 事件监听机制原理剖析 5 广播模式剖析 6 ZooKeeper集
  • vs报错:TRACKER : 错误 TRK0005: 未能找到: “CL.exe”。系统找不到指定的文件

    平台 win 10 错误 如题 解决 1 参考 Windows11下配置Visual Studio2022 环境变量 Windows下配置Visual Studio 通用 2 1 运行 C Program Files Microsoft V
  • java定义一个类_Java类的定义格式:Java如何定义一个类

    在面向对象的思想中 最核心的就是对象 为了在程序中创建对象 首先需要定义一个类 类是对象的抽象 它用于描述一组对象的共同特征和行为 例如人都有姓名 年龄 性别等特征 还有学习 工作 购物等行为 以面向对象的编程思想 就可以将某一类中共同的特
  • 图的深度优先搜索和广度优先搜索

    图的深度优先搜索算法 dfs 图的深度优先搜索算法是以一个顶点为起始点开始挖掘 一个分支挖掘完 再继续挖掘下一个分支 在实现上需要用到栈 因此 图的深度优先搜索算法有很多条路径 取决于哪个顶点最先入栈 实现思路 非递归 dfs可以用栈来进行
  • 解决QT中TCP传数据的困惑

    问题一 当传输数据过大时 readAll不能读完这一条完整的报文 报文格式如下 解决方法 针对此问题 可以通过一个全局变量 将多次读到的数据合并 问题二 粘包现象之多次write对应一次read 深入查看ReadyRead 信号的产生条件可
  • CNN笔记:通俗理解卷积神经网络

    通俗理解卷积神经网络 cs231n与5月dl班课程笔记 1 前言 2012年我在北京组织过8期machine learning读书会 那时 机器学习 非常火 很多人都对其抱有巨大的热情 当我2013年再次来到北京时 有一个词似乎比 机器学习
  • make编译出错Relocations in generic ELF (EM: 62)

    参考 编译出错Relocations in generic ELF EM 62 main o Relocations in generic ELF EM 62 错误信息是 通过查看文件 main o 发现ELF 64bit x86 64 在
  • ClickHouse副本同步及分布式DDL的原理

    相信了解大数据的小伙伴们都知道 基本上所有的分布式存储系统都有一个共同的特点 将庞大的数据量分成多个小块存储在不同的机器上 通常称为分片 每个分片为了保证它数据不丢失 它们又有各自副本 ClickHouse也不例外 一起来看看ClickHo
  • 5.Mybatis 缓存详解

    5 1 一级缓存 一级缓存 也叫本地缓存 默认会开启 并且不能控制 想要关闭一级缓存可以在select标签上配置flushCache true 一级缓存存在于 SqlSession 的生命周期中 在同一个 SqlSession 中查询时 M

随机推荐

  • 微信小程序之如何注册微信小程序

    注册小程序帐号 在微信公众平台官网首页 mp weixin qq com 点击右上角的 立即注册 按钮 选择注册的帐号类型 显示了4选项 我们现在是注册小程序 所以选择小程序 填写邮箱和密码 请填写未注册过公众平台 开放平台 企业号 未绑定
  • VMware虚拟机安装ubuntu20.04缓慢、卡顿

    背景 VMware Workstation版本是14 本地虚拟机上ubuntu版本是16 04的 有32位和64位 编译原理课程需要18或20以上的版本 决定再装一个20的 出现各种问题 进入黑屏 等三五分钟才缓过来 选择语言中文后 安装卡
  • C# ModbusTcp(协议)

    以下用例为读取线圈 可读取多个连续的线圈 01功能码 起始地址 var inputAddress 4 读取长度 var inputReadLength 8 var station BitConverter GetBytes 4 0 从站地址
  • 编译OpenCV以及openc_contrib提示缺少boostdesc_bgm.i文件出错的解决

    编译OpenCV 以及 openc contrib 提示缺少boostdesc bgm i文件出错的解决 错误 opencv contrib modules xfeatures2d src boostdesc cpp 673 20 fata
  • 软件测试与质量学习笔记3--白盒测试

    1 白盒测试的两种常用技术 覆盖测试 在测试过程中 以覆盖某些程序元素为测试目标的测试 路径测试 从流程图上讲 程序的一次执行对应于从入口到出口的一条路径 针对路径的测试即为路径测试 从广义的角度讲 任何有关路径分析的测试都可以被称为路径测
  • MATLAB大小写字符的转换

    输入一个字符 若为大写字母 则输出其对应的小写字母 若为小写字母 则输入其对应的大写字母 若为数字字符则输出其对应的数值 若为其他字符则原样输出 第一种 clear clc n input enter a number n if n gt
  • 基于STM32的ESP8266使用教程(四)(短篇)

    写在前面 在上一篇中介绍了通过单片机发送指令控制WIFI模块 本来想写一下时钟 I O口及串口的初始化函数 但是因为项目年代久远 一年前做的 怕有错误 误导博友 故不给出代码 见谅 本章要介绍Android端通过WIFI与手机建立连接并通信
  • 代码示例:面向对象——封装、继承、多态(多态的四种类型)

    面向对象 封装 继承 多态 多态的四种类型 1 封装 把客观事物封装成抽象的类 并且类可以把自己的数据和方法只让可信的类或者对象操作 对不可信的进行信息隐藏 public 所有实体都可以访问 protected 只允许本类 和子类 的成员函
  • 【动态规划】---入门(一)

    文章目录 前言 一 斐波那契数列 二 爬楼梯 总结 前言 动态规划入门学习文章记录及总结 动态规划算法的基本思想是 将待求解的问题分解成若干个相互联系的子问题 先求解子问题 然后从这些子问题的解得到原问题的解 对于重复出现的子问题 只在第一
  • 综合案例——手写数字图像处理算法比较

    手写数字图像识别各种算法的比较 1 准备工作 1 1 数据集介绍 使用到了两个手写数字的数据集 scikit learn 中的手写数字数据集 mnist 中的手写数字数据集 1 1 1 scikit learn 中的手写数字数据集 首先来看
  • 清理QT SDK编译后,examples目录中的pdb ilk exp等垃圾文件

    for R s in do del q s s pdb s ilk s exp pause 将上面的代码保存为bat 放到examples根目录下运行 上面的方法是我走的冤枉路 下面的这种方法更简单 在用nmake编译完成后 直接运行nma
  • Bean定义注册机

    org springframework beans factory support BeanDefinitionRegistry 注册Bean定义 org springframework beans factory support Bean
  • docker 安装 oracle

    docker 安装 oracle 拉取镜像 docker pull jaspeen oracle xe 11g 因为版本不同有的可能是jaspeen oracle 11g 运行镜像文件 docker run p 1521 1521 name
  • mysql游标的使用

    p 这是一个游标的使用例子 但是其中有几点需要注意 就是为什么要加入 declare CONTINUE HANDLER FOR SQLSTATE 02000 SET tmpname null 这样的一句话 如果不加的话将直接报错 No da
  • Elasticsearch学习4-数据修改

    数据修改 原文请查看 Modifying Your Data Elasticsearch 提供近乎实时的数据操作和搜索功能 默认情况下 从索引 更新 删除数据到数据出现在搜索结果中 你可以预估一秒钟的延迟 刷新间隔 这是与其他平台 如SQL
  • 波士顿房价(只依据一个特征的)预测

    波士顿房价数据集 波士顿房价数据集中一共有506条数据 涵盖506个不同郊区的房屋数据 在机器学习中 通常要把数据集划分为训练数据集和测试数据集 在波士顿数据库中 默认其中404条是训练数据集 102条作为测试数据集 其中 每条数据有14个
  • arcgis10之矢量数据生成tiff文件

    项目场景 shp数据有时数量过于庞大 不利于操作 但是可以将shp转化成tiff图片导出方便进行下一步操作 解决方案 使用arcgis将shp文件生成tiff即可 具体操作如下 第一步 将shp数据生成栅格数据 具体操作如下图 加载至arc
  • Unable to cast object of type 'System.Decimal' to type 'System.Array'.

    数据库有一个字段AppID 类型定义为numeric 38 0 实体描述如下 Key Column APP ID Required ErrorMessage APP ID不能为空 MaxLength 38 ErrorMessage APP
  • 文件时间对于CP命令的影响

    今天在打包安装包的时候 碰到这样一个问题 打包的服务器时间由于测试需要被改到这个月的月底了 打包的时候我也没有在意这个细节 直接在服务器上重新编译这个代码并且将需要更新的so文件打入tar包里面 tar包的时间 包里面文件的时间都变成这个月
  • 详解如何建立Qt插件学习教程

    如何建立Qt插件学习教程是本文要介绍的内容 主要是来了解QT中插件的应用 如何来建立 文中有详解 具体内容的实现来看详解 QT提供2个API来建立插件 1 高层API扩展QT库 例如定制的数据库驱动 图像格式 字符编码 custom sty