Qt5的插件机制(7)--插件开发示例代码(Lower-level API)

插件代码

接口类头文件 MyPluginInterface.h

#ifndef INTERFACES_H
#define INTERFACES_H

#include <QtPlugin>

#define QtPluginDemo_iid "org.qt-project.Qt.PluginDemo"

class MyPluginInterface
{
public:
	virtual int add(int,int) = 0 ;	// 正确写法
	// virtual int add(int,int);	// 不太妥的写法(虽然这也是正确的虚函数声明语句)
		// 注:接口类中的虚函数都应有实体,或设置为0(推荐),这样
		// C++的编译器才能为接口类生成虚函数表。否则,如果没有实现
		// 接口类的虚函数也没有将其设为0,程序在在链接时可能会失败,
		// 或者链接成功但最后生成的库无法加载(库中有未定义的符号)
};

Q_DECLARE_INTERFACE ( MyPluginInterface, QtPluginDemo_iid ) ;

#endif

插件头文件 MyPlugin.h

#ifndef MYPLUGIN__H
#define MYPLUGIN__H

#include <QObject>
#include <QDebug>
#include "MyPluginInterface.h"

class MyPlugin : public QObject, public MyPluginInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA ( IID QtPluginDemo_iid FILE "MyPlugin.json")
    Q_INTERFACES(MyPluginInterface)

public:
	int add(int,int);
};

#endif

插件源文件 MyPlugin.cpp

#include "MyPlugin.h"

int MyPlugin::add(int a , int b)
{
	return a+b ;
}

#include "moc_MyPlugin.cpp"

JSON文件 MyPlugin.json,本示例中该文件是空的。

工程文件 MyPlugin.pro

TEMPLATE      = lib
CONFIG       += plugin console
QT           += core
HEADERS       = MyPlugin.h MyPluginInterface.h
SOURCES       = MyPlugin.cpp
OTHER_FILES   = MyPlugin.json
TARGET        = MyPlugin
DESTDIR       = ./
INCLUDEPATH  += ./
# install
target.path = ./install
INSTALLS += target

应用程序代码

接口类头文件 MyPluginInterface.h,该文件与插件代码中的一致。

主程序文件 main.cpp

#include "MyPluginInterface.h"
#include <QtPlugin>
#include <QApplication>
#include <QWidget>
#include <QPluginLoader>
#include <QString>
#include <QtDebug>

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	QWidget w;
	QObject* object ;
	w.show();

	app.addLibraryPath(QString("../MyPlugin/install"));	// 添加库路径
	// 加载插件,取得实例
	QPluginLoader l(QString("MyPlugin")) ;
	//QPluginLoader l(QString("libMyPlugin.so")) ;

	if ( (object=l.instance()) != NULL )
	{
		qDebug("plugin loaded .");
		// 使用插件
		int a = 14 , b = 23 ;
		MyPluginInterface* plugin = qobject_cast<MyPluginInterface*>(object) ;
		if (plugin)
			qDebug("%d + %d = %d",a,b,plugin->add(a,b));
	}
	else
	{
		qDebug("failed to load plugin !! ");
		QString errorStr = l.errorString();
		qDebug()<<errorStr;
	}
	return app.exec();
}

MyApp.pro

######################################################################
# Automatically generated by qmake (3.0) ?? 11? 19 02:26:33 2014
######################################################################

TEMPLATE = app
QT += gui core widgets
CONFIG += console
TARGET = MyApp
INCLUDEPATH += .

# Input
HEADERS += MyPluginInterface.h
SOURCES += main.cpp
时间: 2024-08-13 22:39:36

Qt5的插件机制(7)--插件开发示例代码(Lower-level API)的相关文章

Qt5的插件机制(1)--Qt 框架中的插件加载机制概述

概述 Qt的源码中通过 Q<pluginType>Factory.Q<pluginType>Plugin 和 Q<pluginType> 这三个类实现了Qt的插件加载机制, 这个机制可用于加载特定种类的插件.比如通过 QPlatformIntegrationFactory\QPlatformIntegrationPlugin\QPlatformIntegration 三个类可以实现平台类QPA插件(PlatformIntegration)的加载,通过QPlatformI

Qt5的插件机制(2)--QxxxFactory类与QFactoryLoader类

</pre><h1>概述</h1><p>在Qt的插件加载机制的概述中,我已经提到过,一个Q<pluginType>Factory 类往往对应于某一类别.或某种特定功能的插件.在Qt中,为了区分不同类别.不同功能的插件,应该为每一类插件设置一个独特的 IID 值,这个IID值通常是一个长字符串.属于同一类的插件应该具有相同的IDD值.比如,所有平台类QPA插件,包括LinuxFB插件(QLinuxFbIntegration).XCB插件(QXcbI

Qt5的插件机制(6)--开发Qt插件时几个重要的宏

怎样开发Qt插件,能够在Qt Assistant 中搜索"Qt Plugins"或"How to Create Qt Plugins",看看那篇manual中的介绍. 当中涉及到了几个宏 Q_DECLARE_INTERFACE( ClassName, Identifier) This macro associates the given Identifier (a string literal) to the interface class called Class

Qt5的插件机制(3)--QLibraryPrivate类与QLibraryStore类

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Qt5的插件机制(4)--Qt插件的元信息metaData

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

左右JAVA示例代码事件分发和监督机制来实现-绝对原创有用

文章标题:左右JAVA示例代码事件分发和监督机制来实现 文章地址: http://blog.csdn.net/5iasp/article/details/37054171 作者: javaboy2012Email:[email protected]qq:    1046011462 一.场景如果 如果有博客系统中须要实现例如以下功能: 系统中用户公布文章.改动文章.删除文章时,须要一些相关的操作须要运行. 公布文章后,给好友发送邮件通知.给用户加积分,对文章做全文索引. 改动文章后,给好友发送邮

AppCan移动应用开发平台新增9个超实用插件(内含示例代码)

使用AppCan平台进行移动开发,你所需要具备的是Html5+CSS +JS前端语言基础,此外,Hybrid混合模式应用还需结合原生语言对功能模块进行封装,对于没有原生基础的开发者,如何实现App里包括支付.界面布局.地图导航.IM等功能呢? 这里列出9个AppCan新插件,在使用AppCan平台进行移动开发时非常实用. 1. uexInAppPurchase iOS内部支付IAP插件:封装内部支付IAP相关操作. 方法说明: getProductList 得到产品列表方法 purchase 购

微信小程序「官方示例代码」剖析【下】:运行机制

在上一篇<微信小程序「官方示例代码」浅析[上]>中,我们只是简单的罗列了一下代码,这一篇,让我们来玩点刺激的--就是看看IDE的代码,了解它是怎么运行的. 还好微信的开发团队在软件工程的实践还有待提高,我们才有机会可以深入了解他们的代码--真想建议他们看看Growth的第二部分,构建系统. 解压应用 首先你需要有下面的工具啦 Mac电脑 微信web开发者工具.app WebStorm / 其他编程器 或 IDE,最好可以支持重命名 首先,我们需要右键微信web开发者工具.app,然后显示包的内

JQ插件机制

JQ插件概述 所谓的jquery插件,其实就是利用jquery语法,完成的一些工具或者模块.jquery插件是jQuery功能的扩展.可以让开发人员能更好更快速的完成某些特定的需求,只需要用很少的代码就能实现很好的效果. 自定义插件 JQ允许自定义插件,对JQ的方法进行扩展.自定义插件主要分两种: JQ元素扩展和JQ本身扩展. JQ元素扩展: 方法: jQuery.fn.extend(object) 概述 扩展 jQuery 元素集来提供新的方法(通常用来制作插件). 也就是说,该方法可以用来扩