+ -
当前位置:首页 → 问答吧 → 【源码实例】在MeeGo Qt应用程序中加载插件

【源码实例】在MeeGo Qt应用程序中加载插件

时间:2011-08-24

来源:互联网

摘自英特尔软件网络http://g.csdn.net/5194787

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

作者: znuoghco   发布时间: 2011-08-24

飘过……

作者: Z_Y1013   发布时间: 2011-08-24