CTK框架 - 事件监听

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

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);

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

目录
相关文章
|
3月前
|
开发者
Flutter笔记:Widgets Easier组件库(12)使用消息吐丝(Notify Toasts)
Flutter笔记:Widgets Easier组件库(12)使用消息吐丝(Notify Toasts)
75 0
CTK框架 - 第一个插件
前面我们已经介绍了CTK框架的基本信息,接下来我们来一步一步搭建CTK的第一个插件。
125 0
|
6月前
|
存储 JavaScript
【源码共读】类似 Vue 的组件事件触发和监听实现
【源码共读】类似 Vue 的组件事件触发和监听实现
128 0
CTK框架 - 通信 - 插件服务注册和调用
接口就是虚函数(也可以是纯虚函数),也就是最终的服务的前身。 接口对外暴露功能,比如我们给之前写的mainwindow 加一个界面类,并且对外暴露一个popWindow()的接口
136 0
react+hook+ts项目总结-ant design 表单错误的回调事件
react+hook+ts项目总结-ant design 表单错误的回调事件
81 0
react+hook+ts项目总结-ant design 表单错误的回调事件
|
前端开发
前端hook项目pc总结笔记-hook项目文件自定义扎号onchange事件
前端hook项目pc总结笔记-hook项目文件自定义扎号onchange事件
88 0
|
IDE 开发工具 Android开发
使用rxjava创建一个rxbus事件处理框架
RxJava已经出现很多个年头了,但是依然被很多公司使用,如果现在还对RxJava了解的不够透彻, 可以看这个系列对它的分析:相信看完后你对它会有个更全面的认识。 这个系列主要从下面几个方面来讲解: **RxJava基本操作符使用** **RxJava响应式编程是如何实现的** **RxJava的背压机制及Flowable是如何实现背压的** **RxJava的线程切换原理
|
Android开发 开发者
【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )(二)
【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )(二)
161 0
|
Android开发 开发者
【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )
【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )
173 0
|
Android开发 开发者
【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )(一)
【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )(一)
214 0