当前位置: 首页 > news >正文

CTK框架(七):事件监听

目录

1.概述

2.监听接口

3.具体实现


1.概述

        CTK(Common Toolkit)框架中的事件监听机制是一个重要的功能,它允许开发者在特定事件发生时接收到通知并执行相应的操作。CTK框架主要支持三种类型的事件监听:框架事件、插件事件和服务事件。但是这些事件只有再变化时才能监听到,如果已经变化过后,进入一个稳定的状态,这时才去监听,那么是无法监听到的。以下是对这三种事件监听的详细解析:

        框架事件

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

  • RAMEWORK_STARTED:框架已经启动。
  • PLUGIN_ERROR:插件执行过程中发生错误。
  • PLUGIN_WARNING:插件执行过程中产生警告。
  • PLUGIN_INFO:插件的某种信息性事件。
  • FRAMEWORK_STOPPED:框架已经被停止。
  • FRAMEWORK_STOPPED_UPDATE:框架在更新过程中停止。
  • FRAMEWORK_WAIT_TIMEDOUT:在等待超时过期之前,框架没有停止。

        插件事件

插件事件与插件的安装、启动、停止和卸载等过程紧密相关。常见的插件事件包括:

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

通过监听插件事件,开发者可以实时掌握插件的状态变化,并进行相应的处理。        

        服务事件

服务事件主要涉及服务的注册、注销和属性变化等。常见的服务事件包括:

  • REGISTERED:服务已经被注册。
  • MODIFIED:已注册服务的属性被修改。
  • MODIFIED_ENDMATCH:已注册服务的属性已被修改,并且新属性不再与侦听器的筛选器匹配。
  • UNREGISTERING:此服务正在注销过程中。

通过监听服务事件,开发者可以了解到服务的生命周期状态,并在必要时采取相应的措施。

2.监听接口

主要是ctkPluginContext提供的六个函数:

class CTK_PLUGINFW_EXPORT ctkPluginContext
{//...public:bool connectPluginListener(const QObject* receiver, const char* slot, Qt::ConnectionType type = Qt::QueuedConnection);void disconnectPluginListener(const QObject* receiver, const char* slot = 0);bool connectFrameworkListener(const QObject* receiver, const char* slot, Qt::ConnectionType type = Qt::QueuedConnection);void disconnectFrameworkListener(const QObject* receiver, const char* slot = 0);void connectServiceListener(QObject* receiver, const char* slot,const QString& filter = QString());void disconnectServiceListener(QObject* receiver, const char* slot);//...
};

        在CTK框架中,事件监听通常通过实现相应的监听器接口并在适当的时机注册监听器来实现。监听器可以通过框架提供的接口(如ctkPluginContext)连接到事件源,以便在事件发生时接收到通知。

        此外,CTK框架还支持通过ctkEventAdmin服务进行事件发布和订阅,这是一种更加灵活和强大的事件通信方式。通过ctkEventAdmin,开发者可以定义自定义事件并控制事件的发送和接收。

3.具体实现

以下是一个简单的示例,展示了如何在CTK框架中注册事件监听器:

#include <QObject>  
#include <ctkPluginFrameworkEvent.h>  
#include <ctkPluginEvent.h>  
#include <ctkServiceEvent.h>  class EventListener : public QObject {  Q_OBJECT  public:  explicit EventListener(ctkPluginContext* context, QObject *parent = nullptr);  public slots:  void onFrameworkEvent(const ctkPluginFrameworkEvent &event);  void onPluginEvent(const ctkPluginEvent &event);  void onServiceEvent(const ctkServiceEvent &event);  
};  EventListener::EventListener(ctkPluginContext* context, QObject *parent) : QObject(parent) {  // 假设已有ctkPluginContext *context可用  context->connectFrameworkListener(this, SLOT(onFrameworkEvent(ctkPluginFrameworkEvent)));  context->connectPluginListener(this, SLOT(onPluginEvent(ctkPluginEvent)));  context->connectServiceListener(this, SLOT(onServiceEvent(ctkServiceEvent)));  
}  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);

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

http://www.lryc.cn/news/434220.html

相关文章:

  • 一区霜冰算法+双向深度学习模型+注意力机制!RIME-BiTCN-BiGRU-Attention
  • C语言 | Leetcode C语言题解之第396题旋转函数
  • 利士策分享,克服生活中的困难:走好勇攀高峰的每一步
  • PurchasereturnController
  • mysql 学习笔记 八
  • 反序列化漏洞练习2
  • 基于SpringBoot的社区医院管理系统
  • YOLOv8安装配置教程(Windows版)
  • Linux的历史,版本,Linux的环境安装、简单学习4个基本的Linux指令等的介绍
  • 【论文阅读】01-Survey on Temporal Knowledge Graph
  • 【AIGC】InstructPixPix:基于文本引导的图像编辑技术
  • 无人机动力系统设计之桨叶推力计算
  • LabVIEW重构其他语言开发的旧系统
  • [晕事]今天做了件晕事43 python-byte串长度与转义字符
  • 初识redis(String,Hash,List,Set,SortedSet)
  • Ton与ETH的一些独特的区别
  • C++ | Leetcode C++题解之第396题旋转图像
  • 前向渲染路径
  • Python画笔案例-040 绘制五角星顶圆
  • 【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例
  • 期货量化-群体优化算法:混合蛙跳算法(SFL)
  • tensorflow-线性回归python入门
  • VSCode学习笔记
  • 【Canvas与艺术】菊花孔雀螺旋
  • circuitjs 普通开关和按钮开关
  • 客户端绑定本地端口与服务器建立连接的详细实现
  • C++ std::bind函数用法
  • Caffenie配合Redis做两级缓存
  • MATLAB实现PID参数自动整定
  • UE5学习笔记21-武器的射击功能