插件编程

 插件可以理解为动态库,一种固定接口的动态库.以下摘自网友的理解。代码参考自官方示例。

Qt插件本身是动态库,除此之外,它定义了一组专用的接口,从动态库中导出,供 Qt 的插件管理体系 发现和调用。当你选择 Qt 插件项目模板时, Qt Creator 会自动为你插入专用接口相关的模板代码。
假如你从一个白板做起,实现一个动态库,要想客户方调用,还是需要导出N多的函数。而 Qt
这种,只是它约定了你需要导出什么函数、什么类、怎样查询你导出的接口,它定义了一套规范而已。

接口定义

echo_interface.h

#pragma once#include <QString>
#include <QObject>class EchoInterface
{public:virtual ~EchoInterface() {}virtual QString echo(const QString &message) = 0;
};#define EchoInterface_iid  "org.Examples.EchoInterface"//接口申明.
Q_DECLARE_INTERFACE(EchoInterface, "org.Examples.EchoInterface") //类名. 

插件调用

EchoPluginWindows.h

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_EchoPluginWindows.h"
#include "echo_interface.h"class QString;
class QLineEdit;
class QLabel;
class QPushButton;
class QGridLayout;class EchoPluginWindows : public QMainWindow
{Q_OBJECTpublic:EchoPluginWindows(QWidget *parent = Q_NULLPTR);private slots:void send_echo();private:Ui::EchoPluginWindowsClass ui;bool loadPlugin();EchoInterface * echo_interface;};

EchoPluginWindows.cpp

#include "EchoPluginWindows.h"
#include <QMessageBox>
#include <QDir>
#include <QPluginLoader>
#include <QtPlugin>
#include <QFileInfo>
#include <QDebug>EchoPluginWindows::EchoPluginWindows(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);setWindowTitle("Echo Plugin Example");if (!loadPlugin()){QMessageBox::information(this,"Error", "Could not load the plugin");ui.lineEdit_msg->setEnabled(false);ui.pushButton->setEnabled(false);}connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(send_echo()));}//发送消息槽函数
void EchoPluginWindows::send_echo()
{QString text = echo_interface->echo(ui.lineEdit_msg->text());ui.lineEdit_answer->setText(text);
}//加载插件
bool EchoPluginWindows::loadPlugin()
{QDir  pluginDir(QApplication::applicationDirPath());if (pluginDir.dirName().toLower() == "debug" || pluginDir.dirName().toLower() == "release"){qDebug() << "applicationDirPath:" << QApplication::applicationDirPath();pluginDir.cdUp();  //回到上一级pluginDir.cdUp();  //回到上一级}pluginDir.cd("plugin");pluginDir.cd("Debug");for each (QFileInfo file_name in pluginDir.entryInfoList(QDir::Files)){//插件加载器QPluginLoader pluginLoader(file_name.absoluteFilePath());QObject * plugin = pluginLoader.instance();if (plugin){echo_interface = qobject_cast<EchoInterface *>(plugin);if (echo_interface){return true;}}}return false;
}

插件库

按照插件接口定义,编写自己的插件库 echo_plugin.h

#pragma once#include "echo_interface.h"
#include <QObject>class  EchoPlugin : public QObject, EchoInterface
{Q_OBJECTQ_PLUGIN_METADATA(IID "com.xhome.EchoPlugin")  //插件元信息.Q_INTERFACES(EchoInterface)  //接口申明.public:QString echo(const QString &message) override;};

echo_plugin.cpp

#include "echo_plugin.h"
#include <QtWidgets/QtWidgets>//对接口进行实现即可.
QString EchoPlugin::echo(const QString &message)
{return message;
}

结果演示

20.QT中插件编程相关推荐

  1. qt中socket编程

    1 文章概括 在qt中借助designer设计通信界面,然后使用QTcpServer,QTcpSocket编写服务器和客户端的程序. 首先建立两个工程,一个是客户端client,另一个是服务器端ser ...

  2. Qt中的网络编程(TCP)

    在Qt中网络编程主要由Qt Network模块来编写基于TCP/Ip的网络程序,其中提供了许多的类: 可以点击该链接查看:Qt网络C++类|Qt网络 5.15.12  常见的有: QTcpServer ...

  3. Qt中的OpenGL

    Qt还是本人可移植GUI程序开发的首选,不过Qt开发普通的应用程序是行,但是据说效率太低,以至于像某些人说的那种刷新看得到一条条横线?这点我比较纳闷,就我使用的感觉,虽然Qt不以效率著称,但是事实上有 ...

  4. QT Model/View 编程:MVC模型视图编程:实例实现(二)

    目录 样例001:现有模型中使用视图Using views with an existing model 样例002:使用模型索引 样例003:使用模型 样例004:使用模型的多个视图 样例005:委 ...

  5. Qt中TCP服务端编程

    文章目录 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 1.2 Qt中的TCP服务端编程 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 网络中的服务端: 服务端是为客户端服 ...

  6. Qt中的TCP客户端编程

    文章目录 1 Qt中的TCP客户端编程 1.1 TCP客户端编程介绍 1.2 QTcpSocket的同步编程 1.3 QTcpSocket的异步编程 1 Qt中的TCP客户端编程 1.1 TCP客户端 ...

  7. 从SOURCE_BUFFER单元开始存放了20个字母A, 编程将这20个字母A的字符串传送到DEST_BUFFER开始的单元中.

    从SOURCE_BUFFER单元开始存放了20个字母A, 编程将这20个字母A的字符串传送到DEST_BUFFER开始的单元中. data segment source_buffer db 20 du ...

  8. html5二次元插件,送你PS一键制作动漫二次元插件,80套背景+50种效果+20款中英字体...

    原标题:送你PS一键制作动漫二次元插件,80套背景+50种效果+20款中英字体 啦啦啦,柠檬又来给同学们分享福利咯!今天带给你们的是一款能够快速把照片转换成二次元风格的PS插件. 本款插件是完全智能化 ...

  9. Qt中采用多线程实现Socket编程

    Qt中采用多线程实现Socket编程 Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 本文介绍的是Qt中采用多线程 ...

最新文章

  1. MySQL配置文件mysql.ini参数详解
  2. 【转载】CMake 简介和 CMake 模板
  3. virtualbox安装centos 6之增强工具
  4. QT的QPen类的使用
  5. matlab浮点数求绝对值_MATLAB仿真阵列天线切比雪夫综合法(附代码)
  6. sqlserver 中事务与错误机制的处理
  7. html仿手机界面,javascript新手实例3-仿手机聊天界面(if else运用)
  8. html/css/js各类相对路径引用方法归类
  9. 计算机教学训练的有效性,充分利用现代教育技术   提高课堂教学有效性
  10. Jquery—Jquery中$与$.fn的区别
  11. 高手对中科院考博英语的分享
  12. Java实现自动映射原生JDBC查询出的数据库字段
  13. linux内存映射对开发版刷屏,TQ6410/OK6410裸机LCD刷屏程序借助UBOOT来执行
  14. realityOS会是苹果的新操作系统吗?
  15. “生成能够被扫描枪正常扫描出中文的二维码”
  16. MultiPath: Multiple Probabilistic Anchor Trajectory Hypotheses for Behavior Prediction
  17. 点、线、圆、矩形、抛物线的类定义_德语词汇-数学类
  18. mysql笔记(一):Navicat for MySQL远程连接mysql服务报错的解决方法(1130、2509)
  19. 点我一下,你将获得排查性能问题的超能力~
  20. Day794.如何用协程来优化多线程业务 -Java 性能调优实战

热门文章

  1. MATLAB-S函数
  2. ENVI二次开发时的注意事项
  3. php是fast_cgi模式,cpanel中的php运行方式使用fast-cgi模式的配置方法
  4. SpringCloud Gateway 服务网关,断言
  5. java hexits,[Java]浅谈Java的异常体系
  6. selenium headless报错Message: unknown error: failed to wait for extension background page to load
  7. git 配置.gitignore 删除已提交的文件
  8. Numpy ndarry按行、列求和
  9. selenium隐式等待
  10. 配置阿里云docker加速与云镜像配置