`
cloverprince
  • 浏览: 130605 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

插件问题回答第2题 另解

阅读更多
问题贴:http://cloverprince.iteye.com/blog/481307

引用

2. 现有一个主程序用C++语言写成。现在要允许第三方开发人员编写扩展的类,约定第三方开发的类必须包含一个继承自某个已知类(如class FooPlugin)的子类,名称不限。如果要求第三方的类必须与主程序的二进制代码分开发布,把dll或so丢在某个文件夹内即可被动态装载使用,应如何实现?



回答:

除了直接使用操作系统提供的接口以外,还可以使用Qt提供的插件系统。我们需要一个纯虚类,并用Q_DECLARE_INTERFACE宏声明该接口。插件模块中,具体类继承该接口,并用Q_EXPORT_PLUGIN2输出该具体类。主程序中,用QPluginLoader装载该模块,用QPluginLoader::instance()获得实例,用qobject_cast<>()转换成接口类型。


适用范围:

Qt 4.x


实现:

接口定义:hellointerface.h
#ifndef HELLOINTERFACE_H
#define HELLOINTERFACE_H

#include <QtPlugin>

class HelloInterface
{
public:
    virtual ~HelloInterface() {}

    virtual QString getName() const = 0; // 取得名字
    virtual void setName(QString name) = 0; // 设置名字

    virtual void greet() = 0; // 打招呼
};

 Q_DECLARE_INTERFACE(HelloInterface,
                     "com.trolltech.PlugAndPaint.BrushInterface/1.0")

#endif // HELLOINTERFACE_H



这里只做一个插件
helloworldplugin.h
#ifndef HELLOWORLDPLUGIN_H
#define HELLOWORLDPLUGIN_H

#include "HelloWorldPlugin_global.h"
#include "../hellointerface.h"

class HELLOWORLDPLUGINSHARED_EXPORT HelloWorldPlugin :
        public QObject,
        public HelloInterface
{
    Q_OBJECT
    Q_INTERFACES(HelloInterface)

private:
    QString name;

public:
    virtual QString getName() const;
    virtual void setName(QString name);

    virtual void greet();


};

#endif // HELLOWORLDPLUGIN_H


helloworldplugin.c:
#include "helloworldplugin.h"

#include <cstdio>

QString HelloWorldPlugin::getName() const
{
    return this->name;
}

void HelloWorldPlugin::setName(QString name)
{
    this->name = name;
}

void HelloWorldPlugin::greet()
{
    std::printf("Hello, %s\n",this->name.toStdString().c_str());
}

Q_EXPORT_PLUGIN2(helloworldplugin, HelloWorldPlugin)

这里的Q_EXPORT_PLUGIN2宏输出HelloWorldPlugin具体类。第一个参数需要和.pro文件中的TARGET字段相同。


以上是插件。下面是主程序
main.cpp:
#include <QtCore/QCoreApplication>
#include <QPluginLoader>
#include <QDir>

#include "hellointerface.h"

#include <cstdio>

const char* PLUGINS_PATH="plugins";

int main(int argc, char *argv[])
{

    QDir pluginsDir(PLUGINS_PATH);

    foreach(QString fileName, pluginsDir.entryList()) {
        if(fileName.endsWith(".so")) {
            printf("Loading %s\n",fileName.toStdString().c_str());

            QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
            HelloInterface *plugin =
                    qobject_cast<HelloInterface*>(loader.instance());

            plugin->setName("wks");
            plugin->greet();
        }
    }
    return 0;
}



编译:

插件按照Qt Library的方式编译;主程序按照Qt Application方式编译即可。


运行:

文件结构:

引用
.
|-- PluginTest
`-- plugins
    `-- libhelloworldplugin.so



执行结果:
引用
Loading libhelloworldplugin.so
Hello, wks



总结:
1. main程序并不了解plugins目录中有多少插件。在运行时列举目录。 
2. main程序对每个plugins文件(比如叫libhelloworldplugin.so)的了解只有: 
- libhelloworldplugin.so定义了一个类,实现了那个已知接口,并用Q_EXPORT_PLUGIN2输出。 

分享到:
评论

相关推荐

    Discuz_X3.1 X3.2版本正版插件破解文件

    【discuzX3.1 X3.2版本】安装应用后台出现“对不起,您安装的不是正版应用..”的详细解... 很多会员朋友在本网站下载好discuz 模板或者discuz插件上传到网站目录 在后台进行安装的时候会发现 “对不起,您安装的...

    解压缩软件插件

    解压缩用的rar插件。可以支持通用的格式。完全通用。你可以下载试试看。

    moodle CSV格式试题批量上传插件

    Moodle官网上的CSV format 只支持最多4个选项的且只有2个正确答案的多选题。不符合国人习惯。稍作修改,使其能支持多个选项(按照ASCII码,从ABCD开始),答案不限的多选题。基于**All-or-Nothing**插件的试题格式,...

    仿学习强国的填空题输入插件

    一款仿学习强国填空题输入的jQuery代码脚本,填空题固定输入字符的数量。 兼容android与iOS手机的浏览器 标签&lt;span&gt;&lt;/span&gt;即代表填空题的一个空格,提交后获取json数据。

    有道云笔记插件-剪报插件

    第一步:下载得到zip格式的安装文件以后,先行将其解压缩为文件夹 点击下载zip格式安装文件 第二步:打开Chrome浏览器,点击右上角三点,选择【更多工具】-【扩展程序】 第三步:在扩展程序页面中,点击右上角,...

    C#做的自动更新word表、图题注插件(附源码)

    C#做的自动更新word表、图题注插件(附源码) 插件具体说明: word插件:用来生成需要更新的word插件,除了自动更新题注,还提供自定义删除内容(根据word的页码). 插件xp安装环境:.net3.5、vsto、office2007 win7...

    Eclipse插件开发学习笔记(第二篇 核心技术 9-13章)

    第二篇是插件开发核心技术,主要介绍插件开发的核心知识要点,包括行为(Action)、视图(ViewPart)、编辑器(Editor)、透视图(Perspective)等10章的内容;第三篇主要讲述插件开发的高级内容,包括开发高级内容...

    apabi电子图书馆破解插件

    此破解为方正apabi电子图书馆最新4.4.4.1733版本破解插件,压缩包内包括ceb、cebx永不过期补丁、完全解密补丁,以及cebx修改教程。ceb破解补丁修正了win7下不能执行bug。

    eclipse插件开发第二版(英文版).part3.4.rar

    《Eclipse插件开发第二版》是针对Eclipse平台进行扩展和定制的权威指南,英文版的第二版为开发者提供了全面且深入的指导。这部分压缩文件包含的是该书的第三部分和第四部分,旨在帮助读者深入理解并掌握Eclipse插件...

    手机端html5滑动选择题插件

    首先,我们要明白手机端HTML5滑动选择题插件的主要目标是为用户提供一个流畅的、适应不同屏幕尺寸的选择题浏览和解答环境。这种插件通常具有响应式设计,能够自动适应手机、平板电脑等不同设备的屏幕大小。响应式...

    .net压缩解压缩插件

    《.NET压缩解压缩插件:ICSharpCode.SharpZipLib深入解析》 在.NET开发环境中,处理压缩和解压缩任务是一项常见的需求。为了简化这一过程,开发者们常常依赖于第三方库,其中ICSharpCode.SharpZipLib是一个非常流行...

    apabi reader 4.5.2.1785 破解插件

    apabi reader 4.5.2.1785 破解插件,原来的自签发证书,在winxp sp3 最新更新系统下存在证书验证问题,主要是由于微软最新补丁更新了原来的证书验证漏洞所致,因此会导致软件在联网的情况下出现证书验证问题。...

    rtx2015插件合集

    为了保证插件的安全性和兼容性,用户应当优先考虑从官方渠道或可信的第三方平台下载插件,并且保持定期更新,以确保与RTX2015的最新版本兼容。插件更新不仅仅是为了增加新功能,更重要的是修复已知问题和漏洞,确保...

    雨滴时间插件和音乐插件.zip

    为了使用这两个插件,用户首先需要将"雨滴时间插件和音乐插件.zip"解压缩,然后根据插件的安装说明进行操作。这可能涉及到复制文件到特定的插件目录,或者在应用程序中通过菜单选项导入插件。确保插件与操作系统和...

    Chrome插件-《Astro Bot》用新标签页刷编程题.zip

    《Astro Bot》是一款专为程序员设计的Chrome浏览器插件,它创新性地将编程题和相关新闻融入到浏览器的新标签页之中,旨在帮助用户在浏览网页的同时,保持学习和提升编程技能的习惯。这款插件的独特之处在于其...

    CAD切剖面插件

    CAD切剖面插件是一款专为计算机辅助设计(CAD)软件设计的辅助工具,主要用于帮助用户在二维或三维模型中创建、编辑和分析切剖视图。在工程设计、建筑规划以及产品开发等领域,切剖面是理解复杂几何形状内部结构的...

    linux下的rar解压缩插件

    linux下的rar解压缩插件,可使得系统默认压缩器能够解压rar文件,适用于redhat企业版6,CentOS6等等一些列

    discuz论坛积分商城插件

    第二步:找到source文件夹。双击source,可以看到有许多文件,找到plugin的文件夹。进入plugin文件夹,把我们下载的插件文件夹,上传到网站plugin文件夹内。、 第三部;上传成功,现在可以正式进入论坛网站后台,...

    乐玩插件8.02.rar

    安装插件的过程通常很简单,用户只需下载包含插件的压缩文件(如“乐玩插件8.02.rar”),解压缩后按照安装指南操作即可。有时,插件会自动与主应用集成,有时则需要用户手动配置。在使用过程中,应注意定期更新插件...

    unity选择题Demo Quiz Maker v1.2(答题插件).unitypackage

    问答插件

Global site tag (gtag.js) - Google Analytics