插件代码

接口类头文件 MyPluginInterface.h


[cpp]view plaincopy

#ifndefINTERFACES_H

#defineINTERFACES_H

#include<QtPlugin>

#defineQtPluginDemo_iid"org.qt-project.Qt.PluginDemo"

classMyPluginInterface

{

public:

virtualintadd(int,int)=0;//正确写法

//virtualintadd(int,int);//不太妥的写法(虽然这也是正确的虚函数声明语句)

//注:接口类中的虚函数都应有实体,或设置为0(推荐),这样

//C++的编译器才能为接口类生成虚函数表。否则,如果没有实现

//接口类的虚函数也没有将其设为0,程序在在链接时可能会失败,

//或者链接成功但最后生成的库无法加载(库中有未定义的符号)

};

Q_DECLARE_INTERFACE(MyPluginInterface,QtPluginDemo_iid);

#endif


插件头文件 MyPlugin.h


[cpp]view plaincopy

#ifndefMYPLUGIN__H

#defineMYPLUGIN__H

#include<QObject>

#include<QDebug>

#include"MyPluginInterface.h"

classMyPlugin:publicQObject,publicMyPluginInterface

{

Q_OBJECT

Q_PLUGIN_METADATA(IIDQtPluginDemo_iidFILE"MyPlugin.json")

Q_INTERFACES(MyPluginInterface)

public:

intadd(int,int);

};

#endif


插件源文件 MyPlugin.cpp



[cpp]view plaincopy

#include"MyPlugin.h"

intMyPlugin::add(inta,intb)

{

returna+b;

}

#include"moc_MyPlugin.cpp"



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

工程文件 MyPlugin.pro


[cpp]view plaincopy

TEMPLATE=lib

CONFIG+=pluginconsole

QT+=core

HEADERS=MyPlugin.hMyPluginInterface.h

SOURCES=MyPlugin.cpp

OTHER_FILES=MyPlugin.json

TARGET=MyPlugin

DESTDIR=./

INCLUDEPATH+=./

#install

target.path=./install

INSTALLS+=target





应用程序代码

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

主程序文件 main.cpp


[cpp]view plaincopy

#include"MyPluginInterface.h"

#include<QtPlugin>

#include<QApplication>

#include<QWidget>

#include<QPluginLoader>

#include<QString>

#include<QtDebug>

intmain(intargc,char*argv[])

{

QApplicationapp(argc,argv);

QWidgetw;

QObject*object;

w.show();

app.addLibraryPath(QString("../MyPlugin/install"));//添加库路径

//加载插件,取得实例

QPluginLoaderl(QString("MyPlugin"));

//QPluginLoaderl(QString("libMyPlugin.so"));

if((object=l.instance())!=NULL)

{

qDebug("pluginloaded.");

//使用插件

inta=14,b=23;

MyPluginInterface*plugin=qobject_cast<MyPluginInterface*>(object);

if(plugin)

qDebug("%d+%d=%d",a,b,plugin->add(a,b));

}

else

{

qDebug("failedtoloadplugin!!");

QStringerrorStr=l.errorString();

qDebug()<<errorStr;

}

returnapp.exec();

}


MyApp.pro



[cpp]view plaincopy

######################################################################

#Automaticallygeneratedbyqmake(3.0)??11?1902:26:332014

######################################################################

TEMPLATE=app

QT+=guicorewidgets

CONFIG+=console

TARGET=MyApp

INCLUDEPATH+=.

#Input

HEADERS+=MyPluginInterface.h

SOURCES+=main.cpp