本篇是学习Qt Creator快速入门,插件开发的笔记
 
分为两部分
  1. 创建插件
  2. 使用插件的应用程序(测试插件)
 
插件是被使用的应用程序加载使用的。 是使用插件的应用程序定义接口,插件按照接口来实现。
有几个需要注意的宏,其他的都是常规的CPP代码
 
1.创建插件
 
创建一个插件包括以下几步:
①定义一个插件类,它需要同时继承自QObject类和该插件所提供的功能对应的接口类;
②使用Q_INTERFACES()宏在Qt的元对象系统中注册该接口;
③使用Q_PLUGIN_METADATA()宏导出该插件;
④使用合适的.pro文件构建该插件。
 
 
2.使用插件的应用程序
 
使一个应用程序可以通过插件进行扩展要进行以下几步:
①定义一组接口(只有纯虚函数的抽象类);
②使用Q_DECLARE_INTERFACE()宏在Qt的元对象系统中注册该接口;
③在应用程序中使用QPluginLoader来加载插件;
④使用qobject_cast()来测试插件是否实现了给定的接口。
 
注意事项: 使用插件的应用程序想要正常运行,需要先编译插件项目(生成插件嘛)
 
动手实践
 
下面通过一个小demo来学习这个知识。
这里需要创建两个项目,一个项目用来生成插件,即dll/so文件;另一个项目是一个测试程序,用来使用插件。
因为这两个项目中有共用的文件,所以这里将它们放同一个文件夹下,目录结构如下:
myplugin
----plugin (插件项目)
----plugins (存放生成的插件)
----regexpwindow (使用插件的项目(测试项目))
 
创建插件
创建一个空的qmake项目。Add New添加C++类RegExpPlugin
----plugin.pro
----regexpplugin.h
----regexpplugin.cpp
----myplugin.json
 
plugin.pro
TARGET = regexppligin
TEMPLATE = lib
CONFIG += plugin
DESTDIR = ../plugins
INCLUDEPATH += ../regexpwindow
HEADERS += \
regexpplugin.h
SOURCES += \
regexpplugin.cpp
 
 
myplugin.json
{}
 
regexpplugin.h
 #ifndef REGEXPPLUGIN_H
#define REGEXPPLUGIN_H #include <QObject>
#include "regexpinterface.h" class RegExpPlugin : public QObject,RegExpInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qter.Example.myplugin.RexExpInterface"
FILE "myplugin.json")
Q_INTERFACES(RegExpInterface) public:
QString regexp(const QString &message)override;
}; #endif // REGEXPPLUGIN_H
 
regexpplugin.cpp
#include "regexpplugin.h"
#include <QRegExp>
#include <QtPlugin> QString RegExpPlugin::regexp(const QString &message)
{
QRegExp rx("\\d+");
rx.indexIn(message);
QString str = rx.cap();
return str;
}
说明:
为了使这个类作为一个插件,它需要同时继承自QObject和RegExpInterface.
RegExpInterface是接口类,用来指明插件要实现的功能,其在regexpinterface.h文件
中定义。这个接口由使用它的程序设计。因为插件是为了扩展原有的程序嘛。
 
Q_PLUGIN_METADATA()宏用于声明插件的元数据:
其中必须指明IID标识符,标识符是一个字符串,必须保证它的唯一性;
FILE指定一个JSON格式的插件元数据文件,该参数是可选的,其命名一般使用项目名称即可,内容一般只包含一组大括号。
这里还需要使用Q_INTERFACES()宏将这个接口注册到Qt的元对象系统中,告知Qt这个类实现了哪个接口。
 
测试插件的程序
 
regexpinterface.h //定义接口,这个类中只能包含纯虚函数。
#ifndef REGEXPINTERFACE_H
#define REGEXPINTERFACE_H #include <QString> class RegExpInterface{ public:
virtual ~RegExpInterface(){}
virtual QString regexp(const QString &message) = ;
}; //这个是写在类外面的。浪费了好大一会时间。
Q_DECLARE_INTERFACE(RegExpInterface,
"org.qter.Example.myplugin.RexExpInterface") #endif // REGEXPINTERFACE_H
 
说明:
使用Q_DECLARE_INTERFACE()宏在Qt元对象系统中注册了该接口,其中第二个参数就是前面指定的IID。
 
 
widget.h // 加载插件
 
引入 #include "regexpinterface.h"
private:
RegExpInterface *regexpinterface_;
bool loadPlugin();
 
widget.cpp
#include "widget.h"
#include "ui_widget.h" #include <QPluginLoader>
#include <QMessageBox>
#include <QDir> Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); if(!loadPlugin()){ //如果加载插件失败
QMessageBox::information(this,"Error","");
ui->lineEdit->setEnabled(false);
ui->pushButton->setEnabled(false);
}
} Widget::~Widget()
{
delete ui;
} /**
* @brief Widget::loadPlugin
* @return
*/
bool Widget::loadPlugin(){ QDir pluginsDir("../plugins");
// 遍历插件目录
for (QString fileName : pluginsDir.entryList(QDir::Files)) {
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
if(plugin){
regexpinterface_ = qobject_cast<RegExpInterface *>(plugin);
if(regexpinterface_){
return true;
}
}
} return false;
} void Widget::on_pushButton_clicked()
{
QString str = regexpinterface_->regexp(ui->lineEdit->text());
ui->label_num->setText(str);
}
编译plugin 然后在运行regexpwindow 
 
完!
 
 
 
 
 

[Qt插件]-02创建应用程序插件(插件化开发的一种思路)的更多相关文章

  1. 在WePY中实现了小程序的组件化开发,组件的所有业务与功能在组件本身实现,组件与组件之间彼此隔离,上述例子在WePY的组件化开发过程中,A组件只会影响到A所绑定的myclick

    wepyjs - 小程序组件化开发框架 https://tencent.github.io/wepy/document.html#/?id=%e5%be%ae%e4%bf%a1%e5%b0%8f%e7 ...

  2. 创建VS Code 扩展插件

    VS Code提供了强大的扩展功能,我们可以通过开发插件实现自己的业务模型编辑器.这里我们快速介绍一下插件的创建.开发和发布过程. 创建插件开发模板 首先需要确认系统中安装了node.js,并且可以使 ...

  3. cordova自定义插件的创建过程

    最近学习了cordova插件,记录一下大概的过程,仅供参考. 前期的配置就不记录了网上好多. 在简书上从新写了一个更详细的cordova插件教程,有需要的可以点这里进去看看. 第一步 创建一个cord ...

  4. BAT程序员常用的开发工具,建议收藏!

    今天给大家推荐一批 BAT 公司常用的开发工具,个个好用,建议转发+收藏. 阿里篇 一.Java 线上诊断工具 Arthas Arthas 是阿里巴巴 2018 年 9 月开源的一款 Java 线上诊 ...

  5. [Qt插件]-03创建Qt Designer自定义部件

    如何创建自定义部件并添加到Qt Designer来爽快的拖动部件可视化界面设计?   Qt Designer基于插件的架构使得它可以使用用户设计或者第三方提供的自定义部件,就像使用标准的Qt部件一样. ...

  6. 制作Qt应用程序的插件(使用QtPlugin),对比DLL它是全平台通用的

    在Qt下,插件有两种形式,一种是用于QtCreator下,扩展IDE功能.另一种是用于扩展开发者的应用.本文要讲的是后者. 定义一个纯虚类作为插件接口 #include <QtPlugin> ...

  7. 使用 SailingEase WinForm 框架构建复合式应用程序(插件式应用程序)

    对于一些较小的项目,具备一定经验的开发人员应该能够设计和构建出便于进行维护和扩展的应用程序.但是,随着功能模块数量(以及开发维护这些部件的人员)的不断增加,对项目实施控制的难度开始呈指数级增长. Sa ...

  8. chrome浏览器插件启动本地应用程序

    chrome浏览器插件启动本地应用程序 2014-04-20 00:04:30|  分类: 浏览器插件|举报|字号 订阅     下载LOFTER我的照片书  |     chrome的插件开发这里就 ...

  9. Qt 显示透明flash和编写QtWebkit插件

    Qt 有两种方法可以显示flash. 1. 通过QAxWidget 调用com形式显示flash, 需要本机安装IE flash插件 2. 直接通过qwebview显示flash, 需要下载webki ...

随机推荐

  1. vulstack红队评估(一)

    一.环境搭建: 1.根据作者公开的靶机信息整理: 虚拟机初始所有统一密码:hongrisec@2019   因为登陆前要修改密码,改为了panda666...   2.虚拟网卡网络配置: ①Win7双 ...

  2. K8S-磁盘配额管理-整理

    1.  ephemeral-storage介绍 Kubernetes在1.8的版本中引入了一种类似于CPU,RAM的新的资源模式:ephemeral-storage属性(直译为临时存储),并且在1.1 ...

  3. 多语言工作者の十日冲刺<3/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--第三天(05.02) 作业正文 ...

  4. class 类组件:

    ES6  中的class 类组件: // class 关键字:确定一个类型student以类的概念存在 class student{ //构造函数 是默认自动执行 // 初始化 name age 属性 ...

  5. elasticserach数据库深度分页查询的原理

    深度分页存在的问题 https://segmentfault.com/a/1190000019004316?utm_source=tag-newest 在实际应用中,分页是必不可少的,例如,前端页面展 ...

  6. java 加密与解密艺术

    视频来自黑马程序员公开课 对称加密之后的密文可能存在乱码,这些乱码无法识别,信息经过加密后会变成一串毫无规律的二进制串,此时再选择一种编码方式来展示,通常是 BASE64 格式的编码. 为了解决这个问 ...

  7. JavaWeb网上图书商城完整项目--day02-21.退出功能的实现

    1.当用户点击退出的时候,跳转到登陆页面 当用户点击退出的时候,需要将session中保存的登陆的用户销毁掉 当用户点击退出的时候,调用UserServlet的quit方法 退出按钮在top.jsp中 ...

  8. 恕我直言你可能真的不会java第6篇:Stream性能差?不要人云亦云

    一.粉丝的反馈 问:stream比for循环慢5倍,用这个是为了啥? 答:互联网是一个新闻泛滥的时代,三人成虎,以假乱真的事情时候发生.作为一个技术开发者,要自己去动手去做,不要人云亦云. 的确,这位 ...

  9. SQLSTATE[42000]: Syntax error or access violation: 1253 COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'binary'

    SQLSTATE[42000]: Syntax error or access violation: 1253 COLLATION 'utf8mb4_unicode_ci' is not valid ...

  10. 个人项目-Wc-Java

    一.Github项目地址: https://github.com/Heiofungfming/xiaoming01 二.PSP表格 PSP2.1 任务内容 计划完成需要的时间(min) 实际完成需要的 ...