CTK Plugin Framework插件框架学习--CTK服务工厂

news2024/12/24 22:07:04

一、前言

注册服务的时候能够用服务工厂来注册;

访问服务getServeice中的plugin参数是执行ctkPluginContext::getService(const ctkServiceReference&)的插件,从而工厂根据执行的不同插件名称返回不同的服务实现


服务工厂的作用

  • 在服务中可以知道是哪个其它插件在使用它;
  • 懒汉式使用服务,需要的时候才new;
  • 厂其它插件使用服务工厂和使用无服务工的服务,没有任何区别,代码都一样;
  • 可根据需要创建多种实现的服务,就是多种服务对应一个插件;

二、新建插件

在这里插入图片描述
插件结构

  • HelloService.h:接口类
  • HelloImpl.h:实现类
  • HelloActivator.h:激活类
  • ServiceFactory.h:服务工厂

工程文件:Hello.pro

QT += core
QT -= gui

TEMPLATE = lib
CONFIG += plugin
TARGET = Hello
DESTDIR = $$OUT_PWD/bin/plugins

include($$PWD/../CTK/CTK_dependency.pri)

HEADERS += \
    HelloActivator.h \
    HelloImpl.h \
    HelloService.h \
    ServiceFactory.h

RESOURCES += \
    qresource.qrc


接口类:HelloService.h

#ifndef HELLOSERVICE_H
#define HELLOSERVICE_H

#include <QtPlugin>

class HelloService
{
public:
    virtual ~HelloService() {}
    virtual void sayHello() = 0;
};

#define HelloService_iid "org.commontk.service.demos.HelloService"
Q_DECLARE_INTERFACE(HelloService, HelloService_iid)

#endif // HELLOSERVICE_H


实现类:HelloImpl.h

#ifndef HELLOIMPL_H
#define HELLOIMPL_H

#include "HelloService.h"
#include <QObject>
#include <QtDebug>

// HelloWorld
//---------------------------------------------------------
class HelloWorldImpl : public QObject, public HelloService
{
    Q_OBJECT
    Q_INTERFACES(HelloService)

public:
    void sayHello() Q_DECL_OVERRIDE {
        qDebug() << "Hello,World!";
    }
};

// HelloCTK
//---------------------------------------------------------
class HelloCTKImpl : public QObject, public HelloService
{
    Q_OBJECT
    Q_INTERFACES(HelloService)

public:
    void sayHello() Q_DECL_OVERRIDE {
        qDebug() << "Hello,CTK!";
    }
};

#endif // HELLOIMPL_H


激活类:HelloActivator.h

#ifndef HELLOACTIVATOR_H
#define HELLOACTIVATOR_H

#include <ctkPluginActivator.h>
#include <ctkPluginContext.h>
#include "HelloService.h"
#include "ServiceFactory.h"

class HelloActivator : public QObject, public ctkPluginActivator
{
    Q_OBJECT
    Q_INTERFACES(ctkPluginActivator)
    Q_PLUGIN_METADATA(IID "HELLO")

public:
    // 注册服务工厂
    void start(ctkPluginContext* context) {
        ServiceFactory *factory = new ServiceFactory();
        context->registerService<HelloService>(factory);
    }

    void stop(ctkPluginContext* context) {
        Q_UNUSED(context)
    }
};


#endif // HELLOACTIVATOR_H


服务工厂:ServiceFactory.h

#ifndef SERVICEFACTORY_H
#define SERVICEFACTORY_H

#include <ctkServiceFactory.h>
#include <ctkPluginConstants.h>
#include <ctkVersion.h>
#include "HelloImpl.h"

class ServiceFactory : public QObject, public ctkServiceFactory
{
    Q_OBJECT
    Q_INTERFACES(ctkServiceFactory)

public:
    ServiceFactory() : m_counter(0) {}

    // 创建服务对象
    QObject* getService(QSharedPointer<ctkPlugin> plugin, ctkServiceRegistration registration) Q_DECL_OVERRIDE {
        Q_UNUSED(registration)

        qDebug() << "Create object of HelloService for: " << plugin->getSymbolicName();
        m_counter++;
        qDebug() << "Number of plugins using service: " << m_counter;

        QHash<QString, QString> headers = plugin->getHeaders();
        ctkVersion version = ctkVersion::parseVersion(headers.value(ctkPluginConstants::PLUGIN_VERSION));
        QString name = headers.value(ctkPluginConstants::PLUGIN_NAME);

        QObject* hello = getHello(version);
        return hello;
    }

    // 释放服务对象
    void ungetService(QSharedPointer<ctkPlugin> plugin, ctkServiceRegistration registration, QObject* service) Q_DECL_OVERRIDE {
        Q_UNUSED(plugin)
        Q_UNUSED(registration)
        Q_UNUSED(service)

        qDebug() << "Release object of HelloService for: "  << plugin->getSymbolicName();
        m_counter--;
        qDebug() << "Number of plugins using service: "  << m_counter;
    }

private:
    // 根据不同的版本,获取不同的服务
    QObject* getHello(ctkVersion version) {
        if (version.toString().contains("alpha")) {
            return new HelloWorldImpl();
        } else {
            return new HelloCTKImpl();
        }
    }

private:
    int m_counter;  // 计数器
};

#endif // SERVICEFACTORY_H


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为NAT实验配置

路由器基础配置 AR2 int g0/0/3 ip add 192.168.10.254 24 int g0/0/2 ip add 192.168.20.254 24 int g4/0/0 ip add 192.168.30.254 24 int g0/0/1 ip add 10.0.23.2 24 int g0/0/0 ip add 10.0.12.2 24 ip route-static 192.168.11.0 24 10.0.12.1 ip route-static 192.168.2…

2022年中国数据库排行榜年终盘点-墨天轮

深山虎啸雄风在&#xff0c;绿野兔奔好景来。 崭新的2023年已经到来&#xff0c;在2022年里&#xff0c;国产数据库行业发生了翻天覆地的变化&#xff0c;投融资此起彼伏&#xff0c;国产化替代进程加速&#xff0c;国产数据库行业发展的如火如荼。墨天轮12期中国数据库排行榜解…

Python验证中心极限定理

中心极限定理 中心极限定理提出了&#xff1a;无论总体服从什么分布&#xff0c;只要n充分大&#xff0c;那么样本均值分布就接近正态分布。 样本的数量越大&#xff0c;取样次数越多&#xff0c;样本平均值的分布也就越接近于一条正态分布曲线。普遍的经验是&#xff0c;样本…

redis 5种数据结构适用场景

网上介绍太笼统了&#xff0c;呕心沥血整理出来的可理解的适用场景&#xff0c;查看下图redis-cli指令大全&#xff1a;点击查看redis指令Redis支持5种数据类型&#xff1a;string&#xff08;字符串&#xff09;hash&#xff08;哈希&#xff09;list&#xff08;列表&#xf…

飞行类手册国际标准简介

在业界有这个说法&#xff1a;三流的企业卖产品&#xff0c;二流的企业卖技术&#xff0c;一流的企业卖标准。一流企业是行业的标杆&#xff0c;行业的制定者。现在标准已经成为最重要的行业发展因素&#xff0c;谁的产品标准一旦为世界所认同&#xff0c;谁就会引领整个产业的…

指针进阶(C语言)

目录 字符指针 使用方法&#xff1a; 1、指向字符 2、指向字符串的首地址 指针数组 数组指针 数组指针的定义 数组名表示的含义 数组指针的使用 数组参数、指针参数 一位数组传参 二维数组传参 一级指针传参 二级指针传参 函数指针 函数指针数组 指向函数指针数组的指针 回调函…

网站让百度收录的技巧有哪些?网站在百度收录情况怎么查询

同样都是新上线的站点&#xff0c;为什么有的人是秒收&#xff0c;有的人可能要等很多时间才能收录&#xff0c;其实这些都是有技巧加快百度收录我们网站的。网站让百度收录的技巧有哪些&#xff1f;1、上线之前做好网站内容 我们在上线之前一定要做好充足的准备&#xff0c;这…

浏览器控制台接口学习

我们在做项目开发时&#xff0c;想知道一个功能调用了后台哪个接口&#xff0c;我们就可以在浏览器控制台中进行查看。 举一个例子&#xff0c;我们在看博客时&#xff0c;发现这一篇文章写的不错&#xff0c;我们在做点赞这个动作时&#xff0c;调用了哪个接口呢&#xff1f; …

linux 内存恒等映射

目录 arm64内存管理 恒等映射 页表定义&#xff0c;采用4级分页模型 创建页表 内存属性 从进程角度看&#xff0c;需要内存的地方 1、进程本身&#xff0c;代码段、数据段用来存储程序本身需要的数据 2、栈空间&#xff1a;用来保存函数调用关系、局部变量、函数参数、函…

在centos系统上安装mongodb数据库

在centos系统上安装mongodb数据库 本文章基于centos8系统; 如何查看当前系统是centos的那个版本 终端输入命令 cat /etc/redhat-release 开始安装官网当前的数据库版本6.0; 查看官方文档 创建 mongodb yum 源头,写入基本信息 vim /etc/yum.repos.d/mongodb-org-6.0.repo [mon…

手把手教你如何创建和美化图表,老板直接给我升职!

一图胜千言。说到图表&#xff0c;想必很多人都被网上酷炫的图表震惊过。比如下面这样的可视化图表&#xff0c;看起来&#xff0c;很高大上有没有。但是&#xff0c;拆解开来&#xff0c;就是由一个个基础图表演变而来的。所以可不要小瞧了基础图表的制作。今天我就教你如何用…

使用ORM方式查询Mongodb里的数据,再也不用记Mongodb的语法(ORM Bee)

使用ORM方式查询Mongodb里的数据,再也不用记Mongodb的语法&#xff08;ORM Bee)Mongodb的语法可读性差&#xff0c;要写复杂查询&#xff0c;要求技术能力高&#xff1b;Java驱动&#xff0c;还要使用另一种语法&#xff1b;学习成本太高了。可以使用ORM方式&#xff0c;轻松搞…

【redis6】第三章(五大常用数据类型)

redis命令列表&#xff1a;http://www.redis.cn/commands.html Redis键 set < key >< value >添加键值对 [rootlocalhost ~]# cd /usr/local/bin [rootlocalhost bin]# redis-server /etc/redis.conf [rootlocalhost bin]# redis-cli 127.0.0.1:6379> set k1 a…

电脑怎么恢复出厂设置?Win10系统恢复出厂设置的方法

电脑经常出现报错的情况&#xff0c;而且还有运行缓慢、卡顿的问题&#xff0c;这代表你的电脑可能出现了老化。想要恢复正常&#xff0c;你可以选择把电脑恢复到出厂设置&#xff0c;从而恢复到原始状态。电脑怎么恢复出厂设置&#xff1f;下面以Win10系统电脑为例&#xff0c…

CTK Plugin Framework插件框架学习--插件通信【事件监听】

文章目录一、前言二、事件三、类通信3.1、新建接收插件3.2、新建发送插件3.3、启用插件四、信号槽通信4.1、新建接收插件4.2、新建发送插件4.3、启用插件五、类通信和信号槽通信的区别六、插件依赖七、获取元数据一、前言 CTK框架中的事件监听&#xff0c;其实就是观察者模式&…

Dolphin Streaming实时计算,助力商家端算法第二增长曲线

丨目录&#xff1a;1.背景2.业务问题3.业界解决方案4.技术方案5.应用示例6.业务收益7.总结1. 背景随着业务朝向精细化经营增长&#xff0c;阿里妈妈商家端营销产品更加聚焦客户投放体验&#xff0c;旨在帮助商家提升经营效果&#xff0c;在变化的市场中找到确定增长。近年来&am…

【OpenGL学习】OpenGL介绍

一、OpenGL是什么&#xff1f; 在早期一般认为OpenGL是一个API(Application Programming Interface, 应用程序编程接口)&#xff0c;包含了一系列可以操作图形、图像的函数。然而&#xff0c;OpenGL本身并不是一个API&#xff0c;它仅仅是一个由Khronos组织制定并维护的规范(S…

商城模式“分享购”意味着什么?关键逻辑是什么?

商城模式“分享购”近期炽手可热的卖家打赏模式电子商务平台&#xff0c;根据申请注册交易赠予贡献度&#xff0c;推动者每日权重计算分派领到固定不动积分兑换数量空投物资&#xff0c;积分兑换前去出售买卖转现&#xff0c;店家根据选购积分兑换完成对客户的交易打赏主播&…

【遥感综述】

遥感综述小集合 Image fusion meets deep learning: A survey and perspective&#xff08;张浩&#xff0c;马佳义&#xff09; Sharpening fusion 多光谱图像锐化和高光谱图像锐化是两种典型的锐化融合任务。 Multi-spectral sharpening多光谱锐化 多光谱锐化是将低空间…

Android开发必修—Activity,View,Window三者之间的密切联系【深度解析】

简介 Activity就像工匠&#xff0c;Window就像是窗户&#xff0c;View就像是窗花&#xff0c;LayoutInflater像剪刀&#xff0c;Xml配置像窗花图纸。 Android根据他们不同的职能让他们各斯其活&#xff0c;同时也相互配合展示给我们灵活、精致的界面。 一张图理清所有层级关系&…