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