版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wyy626562203/article/details/82782012
CTK Plugin Framework嵌入到程序
简述
在已有的应用程序中嵌入CTK插件框架。
CTK 插件框架的使用,主要分为以下几部:
- 初始化并启动插件框架:由
ctkPluginFramework::init()
和ctkPluginFramework::start()
完成 - 获取上下文:由
ctkPluginFramework::getPluginContext()
完成 - 安装插件:由
ctkPluginContext::installPlugin()
完成,与此同时,会返回一个ctkPlugin
对象。 - 启动插件:由
ctkPlugin::start()
完成 - 获取服务引用:由
ctkPluginContext::getServiceReference()
完成 - 获取指定
ctkServiceReference
引用的服务对象:由ctkPluginContext::getService()
完成 - 调用服务
使用CTK插件框架
创建Qt控制台应用程序,.pro
内容如下:
QT += core
QT -= gui
TARGET = LoadCTKPlugin
CONFIG += console
TEMPLATE = app
LIBS += -L$$PWD/Libs -lCTKCore -lCTKPluginFramework
INCLUDEPATH += \
$$PWD/../../CTK-master/Libs/Core \
$$PWD/../../CTK-master/Libs/PluginFramework
SOURCES += main.cpp
根据上述流程编写main.cpp:
#include <QCoreApplication>
#include <QtDebug>
#include <ctkPluginFrameworkFactory.h>
#include <ctkPluginFramework.h>
#include <ctkPluginException.h>
#include <ctkPluginContext.h>
#include "Testing/FrameworkTestPlugins/test_plugin/test_plugin_service.h"
const QString c_strPluginPath = "E:/CTK-Examples/LoadCTKPlugin/plugins/libtest_plugin.dll";
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
ctkPluginFrameworkFactory frameWorkFactory;
QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();
try {
// 初始化并启动插件框架
framework->init();
framework->start();
qDebug() << "CTK Plugin Framework start ...";
} catch (const ctkPluginException &e) {
qDebug() << "Failed to initialize the plugin framework: " << e.what();
return -1;
}
// 获取插件上下文
ctkPluginContext* pluginContext = framework->getPluginContext();
try {
// 安装插件
QSharedPointer<ctkPlugin> plugin = pluginContext->installPlugin(QUrl::fromLocalFile(c_strPluginPath));
// 启动插件
plugin->start(ctkPlugin::START_TRANSIENT);
qDebug() << "Plugin start ...";
} catch (const ctkPluginException &e) {
qDebug() << QString("Failed to install plugin") << e.what();
return -1;
}
// 获取服务引用
ctkServiceReference reference = pluginContext->getServiceReference<testPluginService>();
// 获取指定 ctkServiceReference 引用的服务对象
TestPluginService* testService = qobject_cast<TestPluginService *>(pluginContext->getService(reference));
if (testService != Q_NULLPTR) {
// 调用服务,进行认证
bool isLogin = testService->login("root", "root");
if (isLogin) {
qDebug() << "Login successfully";
} else {
qDebug() << "Login failed";
}
}
return app.exec();
}
ctkPluginContext
是框架内一个插件的执行上下文,以便获取对其他方法的访问权,这样可以与框架进行交互。
ctkPluginContext
提供的方法允许插件:
- 订阅由框架发布的事件
- 使用
Framework service registry
注册服务对象 - 从
Framework service registry
检索ServiceReferences
- 为引用的服务获取和发布服务对象
- 在框架中安装新的插件
- 获取框架中安装的插件列表
- 获得一个插件的
ctkPlugin
对象 - 为(由框架为插件提供的)持久存储区域中为文件创建 QFile 对象
由此可见,ctkPluginContext
在 CTK 插件框架中占据着至关重要的位置。