CTK框架 - 事件监听

文章介绍了CTK框架中的事件监听机制,包括框架事件、服务事件和插件事件的类型,并提供了相应的代码示例来展示如何监听这些事件。框架事件如启动和停止,服务事件涉及服务的注册和注销,而插件事件关注插件的状态变化。示例代码展示了如何创建一个监听器对象并连接到不同的事件监听槽。
摘要由CSDN通过智能技术生成

CTK框架 - 事件监听

CTK一共有三种事件可以监听:框架事件、插件事件、服务事件。但是这些事件只有再变化时才能监听到,如果已经变化过后,进入一个稳定的状态,这时才去监听,那么是无法监听到的。

框架事件

针对整个框架的,相当于只有一个,因为框架只有一个,但是这里有个问题,就是监听这个事件是在框架初始化之后的,所以根本没法监听到框架事件的初始化,只能监听到结束的事件。

类型如下:

enum Type {
	// 框架已经启动
    FRAMEWORK_STARTED,
	// 一个错误发生了
    PLUGIN_ERROR,
	// 一个警告发生了
    PLUGIN_WARNING,
	// 一个消息发生了
    PLUGIN_INFO,
	// 插件已经被停止
    FRAMEWORK_STOPPED,
	// 框架在更新过程中停止。
    FRAMEWORK_STOPPED_UPDATE,
	// 在等待超时过期之前,框架没有停止。
    FRAMEWORK_WAIT_TIMEDOUT
  };

服务事件

在创建、回收插件时的事情,主要体现在服务的注册和注销。

类型如下:

enum Type {
	// 服务已经被注册
    REGISTERED = 0x00000001,
	// 已注册服务的属性被修改。
    MODIFIED = 0x00000002,
	// 此服务正在注销过程中。
    UNREGISTERING = 0x00000004,
	// 已注册服务的属性已被修改,并且新属性不再与侦听器的筛选器匹配。
    MODIFIED_ENDMATCH = 0x00000008
  };

插件事件

在安装、启动插件的过程中呈现的,主要就是插件的一个状态的变化。

类型如下:

 enum Type {
    // 插件已经被安装
    INSTALLED,
	// 插件已经被启动
    STARTED,
	// 插件已经被停止
    STOPPED,
	// 插件已经被更新
    UPDATED,
	// 插件已经被卸载
    UNINSTALLED,
	// 插件已经被解析
    RESOLVED,
	// 插件无法被解析
    UNRESOLVED,
	// 插件即将被激活。
    STARTING,
	// 插件即将停用。
    STOPPING,
	// 插件将被惰性激活。
    LAZY_ACTIVATION
  };

代码示例

// eventlistener.h
#ifndef CTKTEST_EVENTLISTENER_H
#define CTKTEST_EVENTLISTENER_H
#include <QObject>
#include <ctkPluginFrameworkEvent.h>
#include <ctkPluginEvent.h>
#include <ctkServiceEvent.h>
class EventListener : public QObject
{
	Q_OBJECT
public:
    explicit EventListener(QObject *parent = Q_NULLPTR);
    ~EventListener() override;
public slots:
    // 监听框架事件
    void onFrameworkEvent(const ctkPluginFrameworkEvent& event);
    // 监听插件事件
    void onPluginEvent(const ctkPluginEvent& event);
    // 监听服务事件
    void onServiceEvent(const ctkServiceEvent& event);
};
#endif //CTKTEST_EVENTLISTENER_H
// eventlistener.cpp
#include "eventlistener.h"
#include <iostream>
EventListener::EventListener(QObject *parent)
    : QObject(parent)
{

}
EventListener::~EventListener()
{

}
void EventListener::onFrameworkEvent(const ctkPluginFrameworkEvent& event)
{
    if (!event.isNull()) {
        QSharedPointer<ctkPlugin> plugin = event.getPlugin();
        std::cout << "FrameworkEvent: [" << plugin->getSymbolicName().toStdString() << "]"
            << event.getType() << event.getErrorString().toStdString() << std::endl;
    } else {
        std::cout  << "The framework event is null" << std::endl;
    }
}
void EventListener::onPluginEvent(const ctkPluginEvent& event)
{
    if (!event.isNull()) {
        QSharedPointer<ctkPlugin> plugin = event.getPlugin();
        std::cout << "PluginEvent: [" << plugin->getSymbolicName().toStdString() << "]"
                  << event.getType() << std::endl;
    } else {
        std::cout  << "The plugin event is null" << std::endl;
    }
}
void EventListener::onServiceEvent(const ctkServiceEvent &event)
{
    if (!event.isNull()) {
        ctkServiceReference ref = event.getServiceReference();
        QSharedPointer<ctkPlugin> plugin = ref.getPlugin();
        for(const auto &pluginD : ref.getUsingPlugins())
        {
            std::cout << "ServiceEvent: [" << plugin->getSymbolicName().toStdString() << "]"
                      << event.getType() << pluginD->getSymbolicName().toStdString() << std::endl;
        }
    } else {
        std::cout  << "The service event is null" << std::endl;
    }
}

将监听在main函数中加上

// 事件监听
EventListener listener;
pluginContext->connectFrameworkListener(&listener, SLOT(onFrameworkEvent(ctkPluginFrameworkEvent)));
pluginContext->connectPluginListener(&listener, SLOT(onPluginEvent(ctkPluginEvent)));
pluginContext->connectServiceListener(&listener, "onServiceEvent"); //, filter);

之后运行代码即可监听到对应的信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

turbolove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值