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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
在前一篇文章如何在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


摘自英特尔软件网络:

基于i.MX与GENIVI标准的汽车信息娱乐系统开发实战解析 在嵌入式系统开发领域,Linux操作系统因其开源、稳定和高度可定制性,已成为众多智能设备的核心软件平台。其工作原理在于通过模块化的内核与丰富的中间件,为上层应用提供统一的硬件抽象和系统服务。这一技术价值在于极大地提升了软件的可移植性和开发效率,尤其在汽车电子这类对可靠性、实时性要求极高的应用场景中,基于Linux的标准化平台成为行业刚需。汽车信息娱乐系统(IVI)作为智能座舱的核心,其开发长期面临碎片化、周期长、成本高的挑战。GENIVI联盟(现AGL)提出的开放、标准化Linux平台架构,正是为了解决这一 阅读详情

相关推荐

qt4 Q_EXPORT_PLUGIN2 到qt5 Q_PLUGIN_METADATA变化

Plugin loadingAnother significant porting burden, in plugin-heavy systems at least is that the user code required for plugin loading has changed. The moc tool is now responsible for generating plugin m

我是Cj,一个正义之人 8553

qt5制作插件注意事项

目录.pro文件接口类插件功能头文件插件功能源文件插件新添ui文件 .pro文件 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #$$PWD 表示.pro文件所在的目录 DESTDIR = $$PWD/bin # 用于指明编译的目标文件的输出路径 # 引入opencv相关文件 INCLUDEPATH+=E:\opencv3.4.7\opencv\opencv-build\install\include LIBS +=E:\opencv3.4.7\openc

小白一直白 593

Qt插件机制

Not only Qt itself but also Qt application can be extended through plugins. This requires the application to detect and load plugins using QPluginLoader. In that context, plugins may provide arbitrary functionality and are not limited to database drivers,

废弃不用的专栏 3933

Qt文档阅读笔记-Qt4 Lower-Level API扩展Qt Applications(Qt4中Plugin的使用)解析与实例

目录     官方解析 博主栗子   官方解析 Qt应用程序可以对插件进行扩展,要使用QPluginLoader这个类进行加载插件可以提供任意的功能,而且不限制数据库驱动,图像格式,以及其他的Qt功能插件。 当调用插件时要有如下的过程:             1. 定义一个抽象类作为接口,用于调用插件;             2. 使用Q_DECLARE_INTERFAC...

IT1995的博客 4390

Qt中如何编写插件加载插件和卸载插件

Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库。由于在开发项目的过程中,要开发一套插件系统,就使用了Qt的这套类库。一 编写插件编写一个Qt插件需要以下步骤  1.声明一个插件类,2.定义一个类,实现这个插件类定义的接口,定义的这个类必须从QObject集成下来。

河马的BLOG 5182

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

QT 插件简介 什么是插件 插件机制是一种扩展现有程序的机制。插件允许第三方开发者在无需访问主程序源代码的情况下来扩展该程序。插件能够应用的各项服务,包括提供加载方式,使插件可以加载应用程序和网络传输协议中,从而和插件进行数据交换等。简而言之,插件是提供特定接口的库

MeeGo社区博客 2794

详细解读MeeGo系统构架

MeeGo平台被精心设计多个必要的组件,以便为提供最好的用户体验。MeeGo分为三层:  1,MeeGo操作系统基础层,包含Linux内核及其核心服务,以及为MeeGo支持多种平台的硬件适配模块。其中核心服务包括配置数据库GConf,系统库,消息总线和平台信息。  2,MeeGo 中间层,包括网络服务(蓝牙、语音、即时通讯、电话、连接管理),互联网服务(WebKit、网络服务库、地理信息),虚拟图形图像服务(3D[OpenGL]、2D[Cairo]、界面展现[Pango,Qt]、X窗口系统等)、媒体服务(

MeeGo社区博客 2305

Meego 输入法架构介绍

Meego输入法框架与著名的SCIM输入法框架类似,如果对SCIM不了解,可参看之前的转载,Meego输入法主要分为,输入法前端插件,输入法引擎、输入法插件,以及输入法插件管理服务模块、配置模块、进程通信模块。   输入法前端插件,即实现了QInputContext的对象,这些对象被包装在QInputContextPlugin插件中,放置在/usr/lib/qt4/plugins/inppu

liuysheng的专栏 1228

如何创建Qt quick应用程序

Qt(发音为“ cute”,而不是“ cu-tee”)是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中也非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。更多Qt产品详情点击这里>> 点击下载Qt最新试用版 创建Qt快速项目 “新建文件或项目对话框” 从头开始创建新的Qt Quick项目时,可

qq_42444778的博客 807

MeeGo架构

MeeGo平台被精心设计多个必要的组件,以便为提供最好的用户体验。MeeGo分为三层:1,MeeGo操作系统基础层,包含 Linux内核及其核心服务,以及为MeeGo支持多种平台的硬件适配模块。其中核心服务包括配置数据库GConf,系统库,消息总线和平台信息。2,MeeGo 中间层,包括网络服务(蓝牙、语音、即时通讯、电话、连接管理),互联网服务(WebKit、网络服务库、地理信息),虚拟图形图像...

weixin_30741653的博客 194

八年了Qt6终于来啦!Qt Network模块发生重大更改

Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。赶快点击下载Qt最新试用版吧>> 点击获取更多文章教程 【Qtitan组件集】 QtitanRibbon|下载试用:遵循Microsoft Ribbon..

qq_42444778的博客 1万+

关于Qt Webkit模块详细介绍

http://mobile.51cto.com/symbian-287594.htm 关于Qt Webkit模块详细介绍 2011-08-29 10:22 佚名 CSDN博客 我要评论(0) 字号:T | T 关于Qt Webkit模块详细介绍是本文要介绍的内容,主要是来学习webkit的使用方法,具体内容的实现来看本文详解。 AD: 2013云计算架构师峰会超低价

weichushun的专栏 2560

android通讯录开发实例_如何使用Qt IVI Generator开发通讯录应用程序

Qt(发音为“ cute”,而不是“ cu-tee”)是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。可前往慧都网...

weixin_39956353的博客 196

使用Qt IVI Generator生成模型:通讯录开发实战

Qt(发音为“ cute”,而不是“ cu-tee”)是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。可前往慧都网免费下载。 Qt IVI Generator通讯录示例 本示例说明如何使用Qt IVI Generator生

qq_42444778的博客 900

最后的绝唱-----Symbian 最新的IDE开发环境搭建(Updated on 2011-03-07)

我刚用symbian SDK version 0.9时预测Symbian 也许不久的将来会消亡,没想到这么快,Symbian就走上了末路,这不仅关乎于产品战略,也与欧州小国的文化有关。有谁愿意用一套到处是问题 ,到处是独创的特性平台去开发软件产品?特别是在中国。同时也注定了Nokia的MeeGo没有信息走下去,不过我倒欣赏加上QT支持的MeeGO,这是一个多么可惜的产品。 ...

weixin_30673715的博客 89

QT插件开发1 —— 插件的基本创建和使用

插件开发的最简单基本过程

liao315796248的博客 330
上一篇: 如何在MeeGo Qt应用程序中加载插件(一)
下一篇: 用QtContact 实现MeeGo通讯录(一)
moblin
博客等级 码龄18年 370粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值