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(Common Toolkit)框架中的事件监听机制是一个重要的功能,它允许开发者在特定事件发生时接收到通知并执行相应的操作。CTK框架主要支持三种类型的事件监听:框架事件、插件事件和服…...
一区霜冰算法+双向深度学习模型+注意力机制!RIME-BiTCN-BiGRU-Attention
一区霜冰算法双向深度学习模型注意力机制!RIME-BiTCN-BiGRU-Attention 目录 一区霜冰算法双向深度学习模型注意力机制!RIME-BiTCN-BiGRU-Attention效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现RIME-BiTCN-BiGRU-Attention霜冰算法…...
C语言 | Leetcode C语言题解之第396题旋转函数
题目: 题解: #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…...
利士策分享,克服生活中的困难:走好勇攀高峰的每一步
利士策分享,克服生活中的困难:走好勇攀高峰的每一步 在这个纷繁复杂的世界里,每个人都是自己生命旅程中的行者,而生活,则是一条既铺满鲜花又布满荆棘的道路。 我们或许会在某个清晨醒来,发现自己正站在一座…...
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 学习笔记 八
总结 自动提交 查看自动提交状态:SELECT AUTOCOMMIT ; 设置自动提交状态:SET AUTOCOMMIT 0 。 手动提交 AUTOCOMMIT 0 时,使用 COMMIT 命令提交事务。 事务回滚 AUTOCOMMIT 0 时,使用 ROLLBACK 命令回滚事务。 …...
反序列化漏洞练习2
拿到题目,发现目标是获得flag.php的内容,且sis中admin和passwd等于sis2407时会输出fag的内容 根据源码编写序列化代码 <?php error_reporting(0); class sis{public $admin;public $passwd;public function __construct(){$this->admin "sis2407"…...
基于SpringBoot的社区医院管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于JavaSpringBootVueMySQL的社团管理系统【附源码文档】、…...
YOLOv8安装配置教程(Windows版)
YOLOv8安装配置教程(Windows版) 简介:最近由于选择了人工智能方向的专业选修课,课程需要安装配置YOLOv8,经过查阅各种资料后才发现,许多教程都比较老旧,并且文件位置也发生了变化,所…...
Linux的历史,版本,Linux的环境安装、简单学习4个基本的Linux指令等的介绍
文章目录 前言一、Linux的历史二、版本三、Linux的环境安装1. 腾讯云服务器的申请2. xshell的安装与使用 四、 简单学习4个基本的Linux指令1. ls2. pwd3. mkdir4. cd 总结 前言 Linux的历史,版本,Linux的环境安装、简单学习4个基本的Linux指令等的介绍 …...
【论文阅读】01-Survey on Temporal Knowledge Graph
原文名称:Survey on Temporal Knowledge Graph 1 Introduction 目前有两种方法:基于距离模型的嵌入变换方法和基于语义匹配模型的双线性模型。它们的思想都是将包含实体和关系的知识图谱嵌入到连续的低纬度实向量空间中 时间知识图的推理有两种,第一种是…...
【AIGC】InstructPixPix:基于文本引导的图像编辑技术
github:diffusers/examples/instruct_pix2pix/train_instruct_pix2pix_sdxl.py at main huggingface/diffusers GitHub 论文:https://arxiv.org/pdf/2211.09800 摘要 我们提出了一种从人类指令编辑图像的方法:给定一个输入图像和告诉模型做什么的书面…...
无人机动力系统设计之桨叶推力计算
无人机动力系统设计之桨叶推力计算 1. 源由2. 关键参数2.1 特性参数2.1.1 材质(Material)2.1.2 叶片数量(Number of Blades)2.1.3 重量(Weight)2.1.4 噪音水平(Noise Level) 2.2 安装…...
LabVIEW重构其他语言开发的旧系统
在面对一个运行已久、代码不清晰的项目时,如果该项目涉及复杂的通讯协议(如串口和488通讯),重新开发并优化成LabVIEW版本可以极大提升系统的易用性和维护性。为了确保通讯协议的顺利解析和移植,借助专业工具分析现有通…...
[晕事]今天做了件晕事43 python-byte串长度与转义字符
今天办了一件晕事,导致测试结果与预期不一致。 过程是,组装byte串的时候,整个字符串里有转义字符\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具有非结构化,Key/Value,Document,Draph 无关联的,非sql,BASE(原子性,持久性,一致性,隔离性) 认识r…...
Ton与ETH的一些独特的区别
文章目录 前言一、智能合约需要收取租金。二、从数据到大数据的转变三、智能合约不能运行其他合约的getter方法四、合约不是无法改变的五、Ton取消了无限制的数据结构六、钱包和地址具有独立性 前言 TON区块链是一个现代化的区块链,它为智能合约开发带来了一些全新…...
C++ | Leetcode C++题解之第396题旋转图像
题目: 题解: 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种处理方式: 逐像素处理(需要高等质量处理的光)逐顶点处理(需要中等质量处理的光)球谐函数(SH)处理(需要低等质量…...
Python画笔案例-040 绘制五角星顶圆
1、绘制五角星顶圆 通过 python 的turtle 库绘制五角星顶圆,如下图: 2、实现代码 绘制五角星顶圆,以下为实现代码: """五角星顶圆.py """ import turtledef draw_circle(d):turtle.left(90)for _ …...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
数据挖掘是什么?数据挖掘技术有哪些?
目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...
云原生技术驱动 IT 架构现代化转型:企业实践与落地策略全解
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、背景:IT 架构演进的战略拐点 过去十年,企业 IT 架构经历了从传统集中式架构到分布式架构的转型。进入云计算…...
基于 Transformer robert的情感分类任务实践总结之二——R-Drop
基于 Transformer robert的情感分类任务实践总结之一 核心改进点 1. R-Drop正则化 原理:通过在同一个输入上两次前向传播(利用Dropout的随机性),强制模型对相同输入生成相似的输出分布,避免过拟合。实现:…...
