20.QT中插件编程
插件编程
插件可以理解为动态库,一种固定接口的动态库.以下摘自网友的理解。代码参考自官方示例。
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中插件编程相关推荐
- qt中socket编程
1 文章概括 在qt中借助designer设计通信界面,然后使用QTcpServer,QTcpSocket编写服务器和客户端的程序. 首先建立两个工程,一个是客户端client,另一个是服务器端ser ...
- Qt中的网络编程(TCP)
在Qt中网络编程主要由Qt Network模块来编写基于TCP/Ip的网络程序,其中提供了许多的类: 可以点击该链接查看:Qt网络C++类|Qt网络 5.15.12 常见的有: QTcpServer ...
- Qt中的OpenGL
Qt还是本人可移植GUI程序开发的首选,不过Qt开发普通的应用程序是行,但是据说效率太低,以至于像某些人说的那种刷新看得到一条条横线?这点我比较纳闷,就我使用的感觉,虽然Qt不以效率著称,但是事实上有 ...
- QT Model/View 编程:MVC模型视图编程:实例实现(二)
目录 样例001:现有模型中使用视图Using views with an existing model 样例002:使用模型索引 样例003:使用模型 样例004:使用模型的多个视图 样例005:委 ...
- Qt中TCP服务端编程
文章目录 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 1.2 Qt中的TCP服务端编程 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 网络中的服务端: 服务端是为客户端服 ...
- Qt中的TCP客户端编程
文章目录 1 Qt中的TCP客户端编程 1.1 TCP客户端编程介绍 1.2 QTcpSocket的同步编程 1.3 QTcpSocket的异步编程 1 Qt中的TCP客户端编程 1.1 TCP客户端 ...
- 从SOURCE_BUFFER单元开始存放了20个字母A, 编程将这20个字母A的字符串传送到DEST_BUFFER开始的单元中.
从SOURCE_BUFFER单元开始存放了20个字母A, 编程将这20个字母A的字符串传送到DEST_BUFFER开始的单元中. data segment source_buffer db 20 du ...
- html5二次元插件,送你PS一键制作动漫二次元插件,80套背景+50种效果+20款中英字体...
原标题:送你PS一键制作动漫二次元插件,80套背景+50种效果+20款中英字体 啦啦啦,柠檬又来给同学们分享福利咯!今天带给你们的是一款能够快速把照片转换成二次元风格的PS插件. 本款插件是完全智能化 ...
- Qt中采用多线程实现Socket编程
Qt中采用多线程实现Socket编程 Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 本文介绍的是Qt中采用多线程 ...
最新文章
- MySQL配置文件mysql.ini参数详解
- 【转载】CMake 简介和 CMake 模板
- virtualbox安装centos 6之增强工具
- QT的QPen类的使用
- matlab浮点数求绝对值_MATLAB仿真阵列天线切比雪夫综合法(附代码)
- sqlserver 中事务与错误机制的处理
- html仿手机界面,javascript新手实例3-仿手机聊天界面(if else运用)
- html/css/js各类相对路径引用方法归类
- 计算机教学训练的有效性,充分利用现代教育技术 提高课堂教学有效性
- Jquery—Jquery中$与$.fn的区别
- 高手对中科院考博英语的分享
- Java实现自动映射原生JDBC查询出的数据库字段
- linux内存映射对开发版刷屏,TQ6410/OK6410裸机LCD刷屏程序借助UBOOT来执行
- realityOS会是苹果的新操作系统吗?
- “生成能够被扫描枪正常扫描出中文的二维码”
- MultiPath: Multiple Probabilistic Anchor Trajectory Hypotheses for Behavior Prediction
- 点、线、圆、矩形、抛物线的类定义_德语词汇-数学类
- mysql笔记(一):Navicat for MySQL远程连接mysql服务报错的解决方法(1130、2509)
- 点我一下,你将获得排查性能问题的超能力~
- Day794.如何用协程来优化多线程业务 -Java 性能调优实战
热门文章
- MATLAB-S函数
- ENVI二次开发时的注意事项
- php是fast_cgi模式,cpanel中的php运行方式使用fast-cgi模式的配置方法
- SpringCloud Gateway 服务网关,断言
- java hexits,[Java]浅谈Java的异常体系
- selenium headless报错Message: unknown error: failed to wait for extension background page to load
- git 配置.gitignore 删除已提交的文件
- Numpy ndarry按行、列求和
- selenium隐式等待
- 配置阿里云docker加速与云镜像配置