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,本演示样例中该文件是空的。

project文件 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



版权声明:本文博客原创文章,博客,未经同意,不得转载。

posted on 2015-07-20 12:37  gcczhongduan  阅读(546)  评论(0编辑  收藏  举报