如何在MeeGo Qt应用程序中加载插件(二)

在前一篇文章如何在Qt应用程序中加载插件(一)中我们了解了Qt插件的概述,本篇给出详细的例子如何去实现一个动态插件。


1 定义接口类:
1.1.定义共同接口(纯虚类):
程序要能感知插件,需要程序和插件共同遵守某种规则。于是需要在主程序中定义一个共同的接口,该接口直接和插件类交流;
本例中定义一个QContactPlugin interface
//QContactPluginInterface.h
#include
class QContactPluginInterface
{
public:
virtual ~ QContactPluginInterface () {}
virtual int getContact(int v) = 0;
};


1.2.使用宏Q_DECLARE_INTERFACE()
在QContactPluginInterface.h中添加以下代码:
Q_DECLARE_INTERFACE(QContactPluginInterface, "com.intel.Plugin. QContactPluginInterface ");
Q_DECLARE_INTERFACE定义在在qobject.h中,用来告诉Qt meta-object system 这个接口名称.


2.主程序部分:
主程序部分动态加载插件的代码如下:
QDir pluginsDir(qApp->applicationDirPath());
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = pluginLoader.instance();
if (plugin) {
QContactPluginInterface *interface = qobject_cast(plugin);
if (interface) {
qDebug()< getContact (10);
}
}
}
以上这段代码主要包含以下几个步骤:
2.1.到指定路径搜索插件
QDir pluginsDir(qApp->applicationDirPath());
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
2.2.检测并加载插件.
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));


2.3.测试插件是否有效
使用 qobject_cast()测试插件是否给出了相应接口并进行类型转换,转换成接口对象指针.
QContactPluginInterface *interface = qobject_cast(plugin);
if (interface) {
qDebug()< getContact (10);
}


3.编写插件:
pluginXX.h
//Exampel, pluginXX.h
#include
#include " QContactPluginInterface.h"


class PluginXX:public QObject, public QContactPluginInterface
{
Q_OBJECT
Q_INTERFACES(QContactPluginInterface)
public:
PluginXX(QObject *parent=NULL);
int getContact (int v);
};
pluginXX.cpp
// Exampel pluginXX.cpp
#include "pluginXX.h"
PluginXX::PluginXX(QObject *parent)
:QObject(parent)
{
}
int PluginXX::getContact(int v)
{
//todo
return XXNumber;
}
Q_EXPORT_PLUGIN2(pluginXX, PluginXX);
以上这段代码主要包含以下几个步骤:


3.1.声明插件类,
#include
#include " QContactPluginInterface.h"


class PluginXX:public QObject, public QContactPluginInterface
这个类继承QObject 类和接口类,同时注意,需要将接口类的头文件包含。


3.2.使用宏Q_INTERFACES() 
Q_INTERFACES(QContactPluginInterface)
Q_INTERFACES 使用在定义接口类时通过Q_DECLARE_INTERFACE声明过的接口。它同样是用来告诉Qt的moc系统,将使用QContactPluginInterface这个接口。


3.3.输出插件
Q_EXPORT_PLUGIN2(pluginXX, PluginXX);
使用宏 Q_EXPORT_PLUGIN2()是让Qt知道PluginXX是一个插件,第一个参数是插件的名字,第二个参数是库的名字,所以二者经常是相同的。


3.4.构建插件.
#pluginXX.pro
TEMPLATE = lib
CONFIG += plugin
INCLUDEPATH += ../XX
HEADERS = pluginXX.h
SOURCES = pluginXX.cpp
DESTDIR = ../
由以上.pro文件,Qt会自动将其编译为动态插件,在主程序运行时动态加载。
如何在Qt应用程序中加载插件(完)
相关链接:如何在MeeGo Qt应用程序中加载插件(一)参考资料:


http://doc.qt.nokia.com/4.7/plugins-howto.html


http://doc.qt.nokia.com/4.7/qpluginloader.html


http://doc.qt.nokia.com/4.7/tools-echoplugin.html


http://www.cppblog.com/seahouse/archive/2011/02/17/139435.html


http://doc.qt.nokia.com/qtmobility-1.2/contactsactions.html


http://doc.qt.nokia.com/qtmobility-1.2/qserviceplugininterface.html#details


http://www.developer.nokia.com/Community/Wiki/index.php?title=Qt_Service_Framework_%E6%96%87%E6%A1%A3&oldid=95263


http://hi.baidu.com/cyclone/blog/item/0fc7462376f208429822ed1d.html


http://hi.baidu.com/cyclone/blog/item/9c78b051b44f1c08367abeae.html


摘自英特尔软件网络:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值