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);
之后运行代码即可监听到对应的信息