CTK-服務工廠的使用


1、作用

在服務中可以知道是哪個其他插件在使用它;

懶漢式使用服務,需要的時候才new;

廠其他插件使用有服務工廠和使用無服務工的服務,沒有任何區別,代碼都一樣;

可根據需要創建多種實現的服務,就是:多種服務對應一個插件。

2、用打印插件舉例

提供三種服務,分別是:直接打印、打印后加3個點、加上時間戳打印

3、創建工程PrintServer

①、接口類

absprintserver.h

#ifndef ABSPRINTSERVER_H
#define ABSPRINTSERVER_H

#include <QObject>
class AbsPrintServer
{
public:
    virtual ~AbsPrintServer(){}
    virtual void print(QString) = 0;
};
Q_DECLARE_INTERFACE(AbsPrintServer,"judesmorning.zxy.AbsPrintServer")

#endif // ABSPRINTSERVER_H

②、直接打印實現類

printserver.h

#ifndef PRINTSERVER_H
#define PRINTSERVER_H
#include <QObject>
#include "absprintserver.h"

class PrintServer : public QObject, public AbsPrintServer
{
    Q_OBJECT
    Q_INTERFACES(AbsPrintServer)
public:
    PrintServer();
    void print(QString info) override;
};

#endif // PRINTSERVER_H

printserver.cpp

#include "printserver.h"
#include <QDebug>
PrintServer::PrintServer()
{

}

void PrintServer::print(QString info)
{
    qDebug()<<info+"----print plugin for FirstPlugin";
}

③、打印后加3個點實現類

printserverd.h

#ifndef PRINTSERVERD_H
#define PRINTSERVERD_H
#include <QObject>
#include "absprintserver.h"

class PrintServerD : public QObject, public AbsPrintServer
{
    Q_OBJECT
    Q_INTERFACES(AbsPrintServer)
public:
    PrintServerD();
    void print(QString info) override;
};

#endif // PRINTSERVERD_H

printserverd.cpp

#include "printserverd.h"
#include <QDebug>
PrintServerD::PrintServerD()
{

}

void PrintServerD::print(QString info)
{
    qDebug()<<info+"....----print plugin for CreateCtkUiPlugin";;
}

④、加上時間戳打印實現類

printservert.h

#ifndef PRINTSERVERT_H
#define PRINTSERVERT_H


#include <QObject>
#include "absprintserver.h"

class PrintServerT : public QObject, public AbsPrintServer
{
    Q_OBJECT
    Q_INTERFACES(AbsPrintServer)
public:
    PrintServerT();
    void print(QString info) override;
};

#endif // PRINTSERVERT_H

printservert.cpp

#include "printservert.h"
#include <QDebug>
#include <QTime>
PrintServerT::PrintServerT()
{

}
void PrintServerT::print(QString info)
{
    qDebug()<<QTime::currentTime().toString("HH:mm:ss    ")<<info+"----print plugin for CreateCtkUiPlugin";
}

⑤、服務工廠類

servicefactory.h

#ifndef SERVICEFACTORY_H
#define SERVICEFACTORY_H
#include <QObject>
#include "printserver.h"
#include "printserverd.h"
#include "printservert.h"
#include "ctkServiceFactory.h"
class ServiceFactory : public QObject, public ctkServiceFactory
{
    Q_OBJECT
    Q_INTERFACES(ctkServiceFactory)
public:
    ServiceFactory();
    QObject* getService(QSharedPointer<ctkPlugin> plugin, ctkServiceRegistration registration) override;
    void ungetService(QSharedPointer<ctkPlugin> plugin, ctkServiceRegistration registration,QObject* service) override;
};

#endif // SERVICEFACTORY_H

servicefactory.cpp

#include "servicefactory.h"
#include "ctkPlugin.h"
#include "ctkPluginConstants.h"
#include <QDebug>
ServiceFactory::ServiceFactory()
{

}

QObject *ServiceFactory::getService(QSharedPointer<ctkPlugin> plugin, ctkServiceRegistration registration)
{
    Q_UNUSED(registration)
    QHash<QString,QString> headers = plugin->getHeaders();
    ctkVersion version = ctkVersion::parseVersion(headers.value(ctkPluginConstants::PLUGIN_VERSION));
    QString name = headers.value(ctkPluginConstants::PLUGIN_NAME);
    QString symbolicName = headers.value(ctkPluginConstants::PLUGIN_SYMBOLICNAME);
    Q_UNUSED(version) //暫時沒使用到
    Q_UNUSED(name)
    QObject* obj;
    if(symbolicName == "FirstPlugin")
    {
        obj = new PrintServer;
    }
    else if(symbolicName == "CreateCtkUiPlugin")
    {
        obj  = new PrintServerT;
    }
    else
    {
       obj  = new PrintServerD;
    }
    return obj;
}

void ServiceFactory::ungetService(QSharedPointer<ctkPlugin> plugin, ctkServiceRegistration registration, QObject *service)
{
    Q_UNUSED(plugin)
    Q_UNUSED(registration)
    Q_UNUSED(service)
}

⑥、激活類

activator.h

#ifndef ACTIVATOR_H
#define ACTIVATOR_H

#include <QObject>
#include "ctkPluginActivator.h"
#include "ctkPluginContext.h"
#include "servicefactory.h"
class Activator : public QObject , public ctkPluginActivator
{
    Q_OBJECT
    Q_INTERFACES(ctkPluginActivator)
    Q_PLUGIN_METADATA(IID  "PrintServer")
public:
    Activator();
    void start(ctkPluginContext* context) override;
    void stop(ctkPluginContext* context) override;
private:
    QScopedPointer<ServiceFactory> factory;
};

#endif // ACTIVATOR_H

activator.cpp

#include "activator.h"

Activator::Activator()
{

}

void Activator::start(ctkPluginContext *context)
{
    ServiceFactory* s = new ServiceFactory;
    context->registerService<AbsPrintServer>(s);
    factory.reset(s);
}
void Activator::stop(ctkPluginContext *context)
{
    Q_UNUSED(context)
}

⑦、工程結構

 

 4、app

main.cpp

#include <QApplication>
#include <ctkPluginFrameworkFactory.h>
#include <ctkPluginFramework.h>
#include <ctkPluginException.h>
#include <ctkPluginContext.h>
#include <QDebug>
#include <QUrl>
#include <QDialog>
#include <QDir>
//ctk頭文件
#include "ctkPluginFrameworkLauncher.h"
#include "ctkPluginContext.h"
#include "ctkPluginException.h"
//插件頭文件
#include "abslogservice.h"
#include "absuiservice.h"
#include "signal.h"
#include "slot.h"
#include "absprintserver.h"
QString static  logPluginPath = QDir::currentPath()+"/third_libs/plugin/libs/ctk-plugin-first.dll";;//日志插件
QString static  uiPluginPath = QDir::currentPath()+"/third_libs/plugin/libs/CreateCtkUiPlugin.dll";//界面框架
QString static  signalPluginPath = QDir::currentPath()+"/third_libs/plugin/libs/ctksignalplugin.dll";//signal插件
QString static  slotPluginPath = QDir::currentPath()+"/third_libs/plugin/libs/ctkslotplugin.dll";//slot插件
QString static  printPluginPath = QDir::currentPath()+"/third_libs/plugin/libs/MPrintServer.dll";//print打印插件
//

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
#if 1 //使用到event框架

    QString path = QDir::currentPath() + "/third_libs/ctk/libs";    // 獲取插件所在位置
    ctkPluginFrameworkLauncher::addSearchPath(path);    // 在插件的搜索路徑列表中添加一條路徑
    ctkPluginFrameworkLauncher::start("org.commontk.eventadmin");

    ctkPluginContext* context = ctkPluginFrameworkLauncher::getPluginContext();    // 獲取插件上下文
    // 啟動打印插件
    try {
        QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(printPluginPath));
        plugin->start(ctkPlugin::START_TRANSIENT);
        qDebug() << "install and start print plugin";
        ctkServiceReference reference = context->getServiceReference<AbsPrintServer>();
        if (reference) {
            // 獲取指定 ctkServiceReference 引用的服務對象
            AbsPrintServer* service = qobject_cast<AbsPrintServer*>(context->getService(reference));
            if (service != Q_NULLPTR)
            {
                // 調用服務
                service->print("running print plugin");
            }
        }
    } catch (const ctkPluginException &e) {
        qDebug() << "Failed to start plugin" << e.what();
    }
    // 啟動日志插件
    try {
        QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(logPluginPath));
        plugin->start(ctkPlugin::START_TRANSIENT);
        qDebug() << "install and start log plugin";
    } catch (const ctkPluginException &e) {
        qDebug() << "Failed to start plugin" << e.what();
    }
    // 啟動插件界面插件
    try {
        QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(uiPluginPath));
        plugin->start(ctkPlugin::START_TRANSIENT);
        qDebug() << "install and start ui plugin";
    } catch (const ctkPluginException &e) {
        qDebug() << "Failed to start plugin" << e.what();
    }
    // 獲取服務引用
    ctkServiceReference reference = context->getServiceReference<AbsUiService>();
    if (reference) {
        // 獲取指定 ctkServiceReference 引用的服務對象
        AbsUiService* service = qobject_cast<AbsUiService*>(context->getService(reference));
        if (service != Q_NULLPTR)
        {
            // 調用服務
            service->init();
        }
    }
    else {
        qDebug()<<"reference is null";
    }
    // 停止插件
//    ctkPluginFrameworkLauncher::stop();
#endif
    return a.exec();
}

 

 

ps:

主框架【main.cpp】的symbolicName是system.plugin


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM