当前位置: 首页 > 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);

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

相关文章:

CTK框架(七):事件监听

目录 1.概述 2.监听接口 3.具体实现 1.概述 CTK&#xff08;Common Toolkit&#xff09;框架中的事件监听机制是一个重要的功能&#xff0c;它允许开发者在特定事件发生时接收到通知并执行相应的操作。CTK框架主要支持三种类型的事件监听&#xff1a;框架事件、插件事件和服…...

一区霜冰算法+双向深度学习模型+注意力机制!RIME-BiTCN-BiGRU-Attention

一区霜冰算法双向深度学习模型注意力机制&#xff01;RIME-BiTCN-BiGRU-Attention 目录 一区霜冰算法双向深度学习模型注意力机制&#xff01;RIME-BiTCN-BiGRU-Attention效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现RIME-BiTCN-BiGRU-Attention霜冰算法…...

C语言 | Leetcode C语言题解之第396题旋转函数

题目&#xff1a; 题解&#xff1a; #define MAX(a, b) ((a) > (b) ? (a) : (b))int maxRotateFunction(int* nums, int numsSize){int f 0, numSum 0;for (int i 0; i < numsSize; i) {f i * nums[i];numSum nums[i];}int res f;for (int i numsSize - 1; i &g…...

利士策分享,克服生活中的困难:走好勇攀高峰的每一步

利士策分享&#xff0c;克服生活中的困难&#xff1a;走好勇攀高峰的每一步 在这个纷繁复杂的世界里&#xff0c;每个人都是自己生命旅程中的行者&#xff0c;而生活&#xff0c;则是一条既铺满鲜花又布满荆棘的道路。 我们或许会在某个清晨醒来&#xff0c;发现自己正站在一座…...

PurchasereturnController

目录 1、 PurchasereturnController 1.1、 反审核退货单 1.1.1、 //配件ID 1.1.2、 //配件编码 1.1.3、 //修改后仓库 1.1.4、 //修改配件信息表库存量 PurchasereturnController using QXQPS.Models; using QXQPS.Vo; using System; using System.Collection…...

mysql 学习笔记 八

总结 自动提交 查看自动提交状态&#xff1a;SELECT AUTOCOMMIT &#xff1b; 设置自动提交状态&#xff1a;SET AUTOCOMMIT 0 。 手动提交 AUTOCOMMIT 0 时&#xff0c;使用 COMMIT 命令提交事务。 事务回滚 AUTOCOMMIT 0 时&#xff0c;使用 ROLLBACK 命令回滚事务。 …...

反序列化漏洞练习2

拿到题目&#xff0c;发现目标是获得flag.php的内容,且sis中admin和passwd等于sis2407时会输出fag的内容 根据源码编写序列化代码 <?php error_reporting(0); class sis{public $admin;public $passwd;public function __construct(){$this->admin "sis2407"…...

基于SpringBoot的社区医院管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于JavaSpringBootVueMySQL的社团管理系统【附源码文档】、…...

YOLOv8安装配置教程(Windows版)

YOLOv8安装配置教程&#xff08;Windows版&#xff09; 简介&#xff1a;最近由于选择了人工智能方向的专业选修课&#xff0c;课程需要安装配置YOLOv8&#xff0c;经过查阅各种资料后才发现&#xff0c;许多教程都比较老旧&#xff0c;并且文件位置也发生了变化&#xff0c;所…...

Linux的历史,版本,Linux的环境安装、简单学习4个基本的Linux指令等的介绍

文章目录 前言一、Linux的历史二、版本三、Linux的环境安装1. 腾讯云服务器的申请2. xshell的安装与使用 四、 简单学习4个基本的Linux指令1. ls2. pwd3. mkdir4. cd 总结 前言 Linux的历史&#xff0c;版本&#xff0c;Linux的环境安装、简单学习4个基本的Linux指令等的介绍 …...

【论文阅读】01-Survey on Temporal Knowledge Graph

原文名称&#xff1a;Survey on Temporal Knowledge Graph 1 Introduction 目前有两种方法:基于距离模型的嵌入变换方法和基于语义匹配模型的双线性模型。它们的思想都是将包含实体和关系的知识图谱嵌入到连续的低纬度实向量空间中 时间知识图的推理有两种&#xff0c;第一种是…...

【AIGC】InstructPixPix:基于文本引导的图像编辑技术

github:diffusers/examples/instruct_pix2pix/train_instruct_pix2pix_sdxl.py at main huggingface/diffusers GitHub 论文&#xff1a;https://arxiv.org/pdf/2211.09800 摘要 我们提出了一种从人类指令编辑图像的方法&#xff1a;给定一个输入图像和告诉模型做什么的书面…...

无人机动力系统设计之桨叶推力计算

无人机动力系统设计之桨叶推力计算 1. 源由2. 关键参数2.1 特性参数2.1.1 材质&#xff08;Material&#xff09;2.1.2 叶片数量&#xff08;Number of Blades&#xff09;2.1.3 重量&#xff08;Weight&#xff09;2.1.4 噪音水平&#xff08;Noise Level&#xff09; 2.2 安装…...

LabVIEW重构其他语言开发的旧系统

在面对一个运行已久、代码不清晰的项目时&#xff0c;如果该项目涉及复杂的通讯协议&#xff08;如串口和488通讯&#xff09;&#xff0c;重新开发并优化成LabVIEW版本可以极大提升系统的易用性和维护性。为了确保通讯协议的顺利解析和移植&#xff0c;借助专业工具分析现有通…...

[晕事]今天做了件晕事43 python-byte串长度与转义字符

今天办了一件晕事&#xff0c;导致测试结果与预期不一致。 过程是&#xff0c;组装byte串的时候&#xff0c;整个字符串里有转义字符\x0d。 from scapy.all import IPv6, UDP pkt IPv6(src"2002:db8:a0b:12f0::157", dst"2002:db8:a0b:12f0::13")/UDP(sp…...

初识redis(String,Hash,List,Set,SortedSet)

认识NoSql sql关系型数据库 nosql非关系型数据库 nosql具有非结构化&#xff0c;Key/Value&#xff0c;Document&#xff0c;Draph 无关联的&#xff0c;非sql&#xff0c;BASE&#xff08;原子性&#xff0c;持久性&#xff0c;一致性&#xff0c;隔离性&#xff09; 认识r…...

Ton与ETH的一些独特的区别

文章目录 前言一、智能合约需要收取租金。二、从数据到大数据的转变三、智能合约不能运行其他合约的getter方法四、合约不是无法改变的五、Ton取消了无限制的数据结构六、钱包和地址具有独立性 前言 TON区块链是一个现代化的区块链&#xff0c;它为智能合约开发带来了一些全新…...

C++ | Leetcode C++题解之第396题旋转图像

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxRotateFunction(vector<int>& nums) {int f 0, n nums.size();int numSum accumulate(nums.begin(), nums.end(), 0);for (int i 0; i < n; i) {f i * nums[i];}int res f;for (int i …...

前向渲染路径

1、前向渲染路径处理光照的方式 前向渲染路径中会将光源分为以下3种处理方式&#xff1a; 逐像素处理&#xff08;需要高等质量处理的光&#xff09;逐顶点处理&#xff08;需要中等质量处理的光&#xff09;球谐函数&#xff08;SH&#xff09;处理&#xff08;需要低等质量…...

Python画笔案例-040 绘制五角星顶圆

1、绘制五角星顶圆 通过 python 的turtle 库绘制五角星顶圆&#xff0c;如下图&#xff1a; 2、实现代码 绘制五角星顶圆&#xff0c;以下为实现代码&#xff1a; """五角星顶圆.py """ import turtledef draw_circle(d):turtle.left(90)for _ …...

如何彻底解决文献格式混乱?Zotero格式规范化处理工具的创新方案

如何彻底解决文献格式混乱&#xff1f;Zotero格式规范化处理工具的创新方案 【免费下载链接】zotero-format-metadata Linter for Zotero. A plugin for Zotero to format item metadata. Shortcut to set title rich text; set journal abbreviations, university places, and…...

从大疆NAZA换到匿名P2飞控:一个DIY玩家的真实体验与参数调试避坑指南

从大疆NAZA到匿名P2飞控&#xff1a;一位DIY玩家的深度迁移指南 当我的F450机架在狭小卧室里显得笨拙不堪时&#xff0c;我意识到需要一次彻底的"瘦身计划"。这不是简单的机架更换&#xff0c;而是一次从商业飞控到开源系统的完整迁移——将大疆NAZA积累的经验移植到…...

GitHub协作开发:AnythingtoRealCharacters2511动漫转真人开源项目实践

GitHub协作开发&#xff1a;AnythingtoRealCharacters2511动漫转真人开源项目实践 1. 项目介绍与准备 AnythingtoRealCharacters2511是一个专门将动漫角色转换为真实人像的开源项目&#xff0c;基于先进的AI图像生成技术。这个项目在GitHub上开源&#xff0c;让开发者可以共同…...

Ubuntu14.04下用USRP B100实现多模式无线传输:从PSK到QAM的实战配置

Ubuntu 14.04环境下USRP B100多模式无线传输实战指南 在软件定义无线电(SDR)领域&#xff0c;USRP设备配合GNU Radio软件平台已经成为研究和开发无线通信系统的黄金标准组合。本文将带您深入探索如何在Ubuntu 14.04系统中配置USRP B100硬件&#xff0c;实现从基础PSK到复杂QAM等…...

避坑指南:用高德DistrictSearch获取精准行政边界时遇到的5个典型问题(含最新GeoJson处理技巧)

高德DistrictSearch深度避坑&#xff1a;5个实战难题与GeoJson优化方案 当你在深夜调试地图边界数据时&#xff0c;突然发现某个街道的轮廓出现了诡异的锯齿状变形——这不是恐怖片情节&#xff0c;而是使用高德DistrictSearch时可能遇到的真实场景。作为经历过数十个地图项目…...

【ROS2 基础】ROS2与Colcon核心指令速查手册与避坑指南

为了在 ROS2 的日常开发中提升效率&#xff0c;本文为您整理了一份结构化的核心指令速查清单。去除了冗长的理论&#xff0c;直击实战痛点&#xff0c;并附带了多平台差异、性能优化数据以及常见报错的修复方案。 文章目录[TOC]一、 快速入门&#xff1a;3步跑通基础流程二、 版…...

TTL门电路在现代数字设计中的应用:从基础到OC门实战

TTL门电路在现代数字设计中的应用&#xff1a;从基础到OC门实战 在数字电路设计的工具箱里&#xff0c;TTL&#xff08;晶体管-晶体管逻辑&#xff09;门电路就像瑞士军刀一样经典而实用。尽管CMOS技术如今占据主流&#xff0c;但TTL在特定场景下依然展现出独特的优势。特别是在…...

Mojo加速Python科学计算:如何在72小时内将AI推理速度提升8.6倍(附完整可运行代码)

第一章&#xff1a;Mojo与Python混合编程概述Mojo 是一种为 AI 系统量身打造的现代系统编程语言&#xff0c;兼具 Python 的易用性与 C/C 的执行效率。它原生兼容 Python 生态&#xff0c;允许开发者在同一个项目中无缝调用 Python 模块、复用现有 NumPy/Torch 代码&#xff0c…...

从CPU到内存:用74LS74芯片手把手教你搭建一个D边沿触发器(附波形图分析)

从面包板到示波器&#xff1a;用74LS74芯片实战D边沿触发器的完整指南 当你第一次在数字电路课本上看到"D边沿触发器"这个词时&#xff0c;是否感觉它像是一个抽象的黑盒子&#xff1f;教科书上的真值表和波形图虽然精确&#xff0c;但总缺少那么一点"触手可及&…...

Phi-4-mini-reasoning vLLM高级特性:LoRA适配器热插拔与多任务推理切换

Phi-4-mini-reasoning vLLM高级特性&#xff1a;LoRA适配器热插拔与多任务推理切换 1. 模型概述 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理。作为Phi-4模型家族的一员&#xff0c;它特别强化了数学推理能力…...