[
  {
    "path": "EventAdmin/SendEvent/App/App.pro",
    "content": "QT += core gui widgets\n\nTEMPLATE = app\nCONFIG += console\nTARGET = App\nDESTDIR = $$OUT_PWD/../bin\n\ninclude($$PWD/../CTK.pri)\n\nSOURCES += \\\n    main.cpp\n"
  },
  {
    "path": "EventAdmin/SendEvent/App/main.cpp",
    "content": "#include <QCoreApplication>\n#include <QtDebug>\n#include <ctkPluginFrameworkLauncher.h>\n#include <ctkPluginContext.h>\n#include <ctkPluginException.h>\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication app(argc, argv);\n\n    // 获取插件所在位置\n    // 在插件的搜索路径列表中添加一条路径\n    ctkPluginFrameworkLauncher::addSearchPath(\"../../../../CTKInstall/lib/ctk-0.1/plugins\");\n    // 设置并启动 CTK 插件框架\n    ctkPluginFrameworkLauncher::start(\"org.commontk.eventadmin\");\n    // 获取插件上下文\n    ctkPluginContext* context = ctkPluginFrameworkLauncher::getPluginContext();\n\n    QString path = QCoreApplication::applicationDirPath() + \"/plugins\";\n\n    // 启动插件 BlogEventHandler\n    try {\n        QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(path + \"/BlogEventHandler.dll\"));\n        plugin->start();\n        qDebug() << \"BlogEventHandler start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to start BlogEventHandler\" << e.what();\n    }\n\n     //启动插件 BlogManager\n    try {\n        QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(path + \"/BlogManager.dll\"));\n        plugin->start();\n        qDebug() << \"BlogManager start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to start BlogManager\" << e.what();\n    }\n\n    // 停止插件\n    ctkPluginFrameworkLauncher::stop();\n\n    return app.exec();\n}\n"
  },
  {
    "path": "EventAdmin/SendEvent/CTK.pri",
    "content": "# CTK 安装路径\nCTK_INSTALL_PATH = $$PWD/../../../CTKInstall\n\n# CTK 插件相关库所在路径（例如：CTKCore.lib、CTKPluginFramework.lib）\nCTK_LIB_PATH = $$CTK_INSTALL_PATH/lib/ctk-0.1\n\n# CTK 插件相关头文件所在路径（例如：ctkPluginFramework.h）\nCTK_INCLUDE_PATH = $$CTK_INSTALL_PATH/include/ctk-0.1\n\n# CTK 插件相关头文件所在路径（主要因为用到了 service 相关东西）\nCTK_INCLUDE_FRAMEWORK_PATH = $$PWD/../../../CTK-master/Libs/PluginFramework\n\nLIBS += -L$$CTK_LIB_PATH -lCTKCore -lCTKPluginFramework\n\nINCLUDEPATH += $$CTK_INCLUDE_PATH \\\n               $$CTK_INCLUDE_FRAMEWORK_PATH\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogEventHandler/BlogEventHandler.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = BlogEventHandler\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    blog_event_handler.h \\\n    blog_event_handler_activator.h\n\nSOURCES += \\\n    blog_event_handler_activator.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogEventHandler/MANIFEST.MF",
    "content": "﻿Plugin-SymbolicName: BlogEventHandler\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for handle event\nPlugin-Name: BlogEventHandler\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogEventHandler/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/BlogEventHandler/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogEventHandler/blog_event_handler.h",
    "content": "﻿#ifndef BLOG_EVENT_HANDLER_H\n#define BLOG_EVENT_HANDLER_H\n\n#include <QObject>\n#include <service/event/ctkEventHandler.h>\n\n// 事件处理程序（或订阅者）\nclass BlogEventHandler : public QObject, public ctkEventHandler\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkEventHandler)\n\npublic:\n    // 处理事件\n    void handleEvent(const ctkEvent& event) Q_DECL_OVERRIDE\n    {\n        QString title = event.getProperty(\"title\").toString();\n        QString content = event.getProperty(\"content\").toString();\n        QString author = event.getProperty(\"author\").toString();\n\n        qDebug() << \"EventHandler received the message, topic:\" << event.getTopic()\n                 << \"properties:\" << \"title:\" << title << \"content:\" << content << \"author:\" << author;\n    }\n};\n\n#endif // BLOG_EVENT_HANDLER_H\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogEventHandler/blog_event_handler_activator.cpp",
    "content": "﻿#include \"blog_event_handler.h\"\n#include \"blog_event_handler_activator.h\"\n#include <service/event/ctkEventConstants.h>\n#include <QtDebug>\n\nvoid BlogEventHandlerActivator::start(ctkPluginContext* context)\n{\n    m_pEventHandler = new BlogEventHandler();\n\n    ctkDictionary props;\n    props[ctkEventConstants::EVENT_TOPIC] = \"org/commontk/bloggenerator/published\";\n    props[ctkEventConstants::EVENT_FILTER] = \"(author=Waleon)\";\n    context->registerService<ctkEventHandler>(m_pEventHandler, props);\n}\n\nvoid BlogEventHandlerActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pEventHandler;\n}\n\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogEventHandler/blog_event_handler_activator.h",
    "content": "﻿#ifndef BLOG_EVENT_HANDLER_ACTIVATOR_H\n#define BLOG_EVENT_HANDLER_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass BlogEventHandler;\n\nclass BlogEventHandlerActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"BLOG_EVENT_HANDLER\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    BlogEventHandler *m_pEventHandler;\n};\n\n#endif // BLOG_EVENT_HANDLER_ACTIVATOR_H\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogManager/BlogManager.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = BlogManager\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    blog_manager.h \\\n    blog_manager_activator.h\n\n\nSOURCES += \\\n    blog_manager.cpp \\\n    blog_manager_activator.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogManager/MANIFEST.MF",
    "content": "﻿Plugin-SymbolicName: BlogManager\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for publish blog\nPlugin-Name: BlogManager\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogManager/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/BlogManager/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogManager/blog_manager.cpp",
    "content": "#include \"blog_manager.h\"\n#include <service/event/ctkEventAdmin.h>\n#include <QtDebug>\n\nBlogManager::BlogManager(ctkPluginContext* context)\n    : m_pContext(context)\n{\n\n}\n\n// 发布事件\nvoid BlogManager::publishBlog(const Blog& blog)\n{\n    ctkServiceReference ref = m_pContext->getServiceReference<ctkEventAdmin>();\n    if (ref) {\n        ctkEventAdmin* eventAdmin = m_pContext->getService<ctkEventAdmin>(ref);\n\n        ctkDictionary props;\n        props[\"title\"] = blog.title;\n        props[\"content\"] = blog.content;\n        props[\"author\"] = blog.author;\n        ctkEvent event(\"org/commontk/bloggenerator/published\", props);\n\n        qDebug() << \"Publisher sends a message, properties:\" << props;\n\n        eventAdmin->sendEvent(event);\n    }\n}\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogManager/blog_manager.h",
    "content": "﻿#ifndef BLOG_MANAGER_H\n#define BLOG_MANAGER_H\n\n#include <ctkPluginContext.h>\n\ntypedef struct Blog_Info {\n    QString title;\n    QString author;\n    QString content;\n} Blog;\n\n// 事件发布者\nclass BlogManager\n{\npublic:\n    BlogManager(ctkPluginContext* context);\n    // 发布事件\n    void publishBlog(const Blog& blog);\n\nprivate:\n    ctkPluginContext* m_pContext;\n};\n\n#endif // BLOG_MANAGER_H\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogManager/blog_manager_activator.cpp",
    "content": "#include \"blog_manager.h\"\n#include \"blog_manager_activator.h\"\n#include <QtDebug>\nvoid BlogManagerActivator::start(ctkPluginContext* context)\n{\n    m_pBlogManager = new BlogManager(context);\n\n    Blog blog;\n    blog.title = \"CTK Event Admin\";\n    blog.content = \"This is a simple blog\";\n    blog.author = \"Waleon\";\n    m_pBlogManager->publishBlog(blog);\n}\n\nvoid BlogManagerActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pBlogManager;\n}\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/BlogManager/blog_manager_activator.h",
    "content": "﻿#ifndef BLOG_MANAGER_ACTIVATOR_H\n#define BLOG_MANAGER_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass BlogManager;\n\nclass BlogManagerActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"BLOG_MANAGER\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    BlogManager *m_pBlogManager;\n};\n\n#endif // BLOG_MANAGER_ACTIVATOR_H\n"
  },
  {
    "path": "EventAdmin/SendEvent/Plugins/Plugins.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    BlogManager \\\n    BlogEventHandler\n\nCONFIG += ordered\n"
  },
  {
    "path": "EventAdmin/SendEvent/SendEvent.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    App \\\n    Plugins\n\nCONFIG += ordered\n"
  },
  {
    "path": "EventAdmin/SendEvent/SendEvent.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.13.0, 2021-03-10T11:44:54. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{c4da1889-17ad-47a8-bddc-cd90da2180db}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.2\">\n    <value type=\"QString\" key=\"language\">Nim</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">NimGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">3</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">2</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"QString\" key=\"EditorConfiguration.ignoreFileTypes\">*.md, *.MD, Makefile</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.skipTrailingWhitespace\">true</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.ActiveFrameworks\">\n    <value type=\"bool\" key=\"AutoTest.Framework.Boost\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.Catch\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.GTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtQuickTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtTest\">true</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.CheckStates\"/>\n   <value type=\"int\" key=\"AutoTest.RunAfterBuild\">0</value>\n   <value type=\"bool\" key=\"AutoTest.UseGlobal\">true</value>\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">4</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"DeviceType\">Desktop</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5151.win64_msvc2019_64_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">1</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\EventAdmin\\build-SendEvent-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/build-SendEvent-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\EventAdmin\\build-SendEvent-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/build-SendEvent-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\EventAdmin\\build-SendEvent-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/build-SendEvent-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"CustomOutputParsers\"/>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/SendEvent/App/App.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/SendEvent/App/App.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/build-SendEvent-Desktop_Qt_5_15_1_MSVC2019_64bit-Release/App/../bin</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "EventAdmin/SignalSlot/App/App.pro",
    "content": "QT += core gui widgets\n\nTEMPLATE = app\nCONFIG += console\nTARGET = App\nDESTDIR = $$OUT_PWD/../bin\n\ninclude($$PWD/../CTK.pri)\n\nSOURCES += \\\n    main.cpp\n"
  },
  {
    "path": "EventAdmin/SignalSlot/App/main.cpp",
    "content": "#include <QCoreApplication>\n#include <QtDebug>\n\n#include <ctkPluginFrameworkLauncher.h>\n#include <ctkPluginContext.h>\n#include <ctkPluginException.h>\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication app(argc, argv);\n\n    // 获取插件所在位置\n\n    // 在插件的搜索路径列表中添加一条路径\n    ctkPluginFrameworkLauncher::addSearchPath(\"../../../../CTKInstall/lib/ctk-0.1/plugins\");\n\n    // 设置并启动 CTK 插件框架\n    ctkPluginFrameworkLauncher::start(\"org.commontk.eventadmin\");\n\n    // 获取插件上下文\n    ctkPluginContext* context = ctkPluginFrameworkLauncher::getPluginContext();\n    QString path = QCoreApplication::applicationDirPath() + \"/plugins\";\n\n    // 启动插件 BlogEventHandlerUsingSlots\n    try {\n        QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(path + \"/BlogEventHandlerUsingSlots.dll\"));\n        plugin->start();\n        qDebug() << \"BlogEventHandlerUsingSlots start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to start BlogEventHandlerUsingSlots\" << e.what();\n    }\n\n    // 启动插件 BlogManagerUsingSignals\n    try {\n        QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(path + \"/BlogManagerUsingSignals.dll\"));\n        plugin->start();\n        qDebug() << \"BlogManagerUsingSignals start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to start BlogManagerUsingSignals\" << e.what();\n    }\n\n    // 停止插件\n    ctkPluginFrameworkLauncher::stop();\n\n    return app.exec();\n}\n"
  },
  {
    "path": "EventAdmin/SignalSlot/CTK.pri",
    "content": "# CTK 安装路径\nCTK_INSTALL_PATH = $$PWD/../../../CTKInstall\n\n# CTK 插件相关库所在路径（例如：CTKCore.lib、CTKPluginFramework.lib）\nCTK_LIB_PATH = $$CTK_INSTALL_PATH/lib/ctk-0.1\n\n# CTK 插件相关头文件所在路径（例如：ctkPluginFramework.h）\nCTK_INCLUDE_PATH = $$CTK_INSTALL_PATH/include/ctk-0.1\n\n# CTK 插件相关头文件所在路径（主要因为用到了 service 相关东西）\nCTK_INCLUDE_FRAMEWORK_PATH = $$PWD/../../../CTK-master/Libs/PluginFramework\n\nLIBS += -L$$CTK_LIB_PATH -lCTKCore -lCTKPluginFramework\n\nINCLUDEPATH += $$CTK_INCLUDE_PATH \\\n               $$CTK_INCLUDE_FRAMEWORK_PATH\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogEventHandlerUsingSlots/BlogEventHandlerUsingSlots.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = BlogEventHandlerUsingSlots\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    blog_event_handler_using_slots.h \\\n    blog_event_handler_using_slots_activator.h\n\nSOURCES += \\\n    blog_event_handler_using_slots_activator.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogEventHandlerUsingSlots/MANIFEST.MF",
    "content": "Plugin-SymbolicName: com.Waleon.BlogEventHandlerUsingSlots\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/Waleon\nPlugin-Description: A plugin for handle event\nPlugin-Name: BlogEventHandlerUsingSlots\nPlugin-Vendor: Waleon\nPlugin-Version: 1.0.0\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogEventHandlerUsingSlots/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/BlogEventHandlerUsingSlots/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogEventHandlerUsingSlots/blog_event_handler_using_slots.h",
    "content": "﻿#ifndef BLOG_EVENT_HANDLER_USING_SLOTS_H\n#define BLOG_EVENT_HANDLER_USING_SLOTS_H\n\n#include <QObject>\n#include <QDebug>\n#include <service/event/ctkEvent.h>\n\n// 事件处理程序（订阅者）\nclass BlogEventHandlerUsingSlots : public QObject\n{\n    Q_OBJECT\n\npublic slots:\n    void onBlogPublished(const ctkEvent& event)\n    {\n        QString title = event.getProperty(\"title\").toString();\n        QString content = event.getProperty(\"content\").toString();\n        QString author = event.getProperty(\"author\").toString();\n\n        qDebug() << \"EventHandler received the message, topic:\" << event.getTopic()\n                 << \"properties:\" << \"title:\" << title << \"content:\" << content << \"author:\" << author;\n    }\n};\n\n#endif // BLOG_EVENT_HANDLER_USING_SLOTS_H\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogEventHandlerUsingSlots/blog_event_handler_using_slots_activator.cpp",
    "content": "#include \"blog_event_handler_using_slots.h\"\n#include \"blog_event_handler_using_slots_activator.h\"\n#include <service/event/ctkEventConstants.h>\n#include <service/event/ctkEventAdmin.h>\n\nvoid BlogEventHandlerUsingSlotsActivator::start(ctkPluginContext* context)\n{\n    m_pEventHandler = new BlogEventHandlerUsingSlots();\n\n    ctkDictionary props;\n    props[ctkEventConstants::EVENT_TOPIC] = \"org/commontk/bloggenerator/published\";\n    ctkServiceReference ref = context->getServiceReference<ctkEventAdmin>();\n    if (ref) {\n        ctkEventAdmin* eventAdmin = context->getService<ctkEventAdmin>(ref);\n        eventAdmin->subscribeSlot(m_pEventHandler, SLOT(onBlogPublished(ctkEvent)), props, Qt::DirectConnection);\n    }\n}\n\nvoid BlogEventHandlerUsingSlotsActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pEventHandler;\n}\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogEventHandlerUsingSlots/blog_event_handler_using_slots_activator.h",
    "content": "﻿#ifndef BLOG_EVENT_HANDLER_USING_SLOTS_ACTIVATOR_H\n#define BLOG_EVENT_HANDLER_USING_SLOTS_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass BlogEventHandlerUsingSlots;\n\nclass BlogEventHandlerUsingSlotsActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"BLOG_EVENT_HANDLER_USING_SLOTS\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    BlogEventHandlerUsingSlots *m_pEventHandler;\n};\n\n#endif // BLOG_EVENT_HANDLER_USING_SLOTS_ACTIVATOR_H\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogManagerUsingSignals/BlogManagerUsingSignals.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = BlogManagerUsingSignals\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    blog_manager_using_signals.h \\\n    blog_manager_using_signals_activator.h\n\nSOURCES += \\\n    blog_manager_using_signals.cpp \\\n    blog_manager_using_signals_activator.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogManagerUsingSignals/MANIFEST.MF",
    "content": "Plugin-SymbolicName: com.Waleon.BlogManagerUsingSignals\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/Waleon\nPlugin-Description: A plugin for publish blog\nPlugin-Name: BlogManagerUsingSignals\nPlugin-Vendor: Waleon\nPlugin-Version: 1.0.0\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogManagerUsingSignals/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/BlogManagerUsingSignals/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogManagerUsingSignals/blog_manager_using_signals.cpp",
    "content": "#include \"blog_manager_using_signals.h\"\n\nBlogManagerUsingSignals::BlogManagerUsingSignals(ctkPluginContext *context)\n{\n    ctkServiceReference ref = context->getServiceReference<ctkEventAdmin>();\n    if (ref) {\n        ctkEventAdmin* eventAdmin = context->getService<ctkEventAdmin>(ref);\n        // 使用 Qt::DirectConnection 等同于 ctkEventAdmin::sendEvent()\n        eventAdmin->publishSignal(this, SIGNAL(blogPublished(ctkDictionary)), \"org/commontk/bloggenerator/published\", Qt::DirectConnection);\n    }\n}\n\n// 发布事件\nvoid BlogManagerUsingSignals::publishBlog(const Blog& blog)\n{\n    ctkDictionary props;\n    props[\"title\"] = blog.title;\n    props[\"content\"] = blog.content;\n    props[\"author\"] = blog.author;\n\n    qDebug() << \"Publisher sends a message, properties:\" << props;\n    emit blogPublished(props);\n\n}\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogManagerUsingSignals/blog_manager_using_signals.h",
    "content": "﻿#ifndef BLOG_MANAGER_USING_SIGNALS_SIGNALS_H\n#define BLOG_MANAGER_USING_SIGNALS_SIGNALS_H\n\n#include <QObject>\n#include <ctkPluginContext.h>\n#include <service/event/ctkEventAdmin.h>\n\ntypedef struct Blog_Info {\n    QString title;\n    QString author;\n    QString content;\n} Blog;\n\n// 事件发布者\nclass BlogManagerUsingSignals : public QObject\n{\n    Q_OBJECT\n\npublic:\n    BlogManagerUsingSignals(ctkPluginContext* context);\n    // 发布事件\n    void publishBlog(const Blog& blog);\n\nsignals:\n    void blogPublished(const ctkDictionary&);\n};\n\n#endif // BLOG_MANAGER_USING_SIGNALS_SIGNALS_H\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogManagerUsingSignals/blog_manager_using_signals_activator.cpp",
    "content": "﻿#include \"blog_manager_using_signals.h\"\n#include \"blog_manager_using_signals_activator.h\"\n\nvoid BlogManagerUsingSignalsActivator::start(ctkPluginContext* context)\n{\n    m_pBlogManager = new BlogManagerUsingSignals(context);\n\n    Blog blog;\n    blog.title = \"CTK Event Admin\";\n    blog.content = \"This is a simple blog\";\n    blog.author = \"Waleon\";\n\n    m_pBlogManager->publishBlog(blog);\n}\n\nvoid BlogManagerUsingSignalsActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pBlogManager;\n}\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/BlogManagerUsingSignals/blog_manager_using_signals_activator.h",
    "content": "﻿#ifndef BLOG_MANAGER_USING_SIGNALS_ACTIVATOR_H\n#define BLOG_MANAGER_USING_SIGNALS_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass BlogManagerUsingSignals;\n\nclass BlogManagerUsingSignalsActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"BLOG_MANAGER_USING_SINGALS\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    BlogManagerUsingSignals *m_pBlogManager;\n};\n\n#endif // BLOG_MANAGER_USING_SIGNALS_ACTIVATOR_H\n"
  },
  {
    "path": "EventAdmin/SignalSlot/Plugins/Plugins.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    BlogManagerUsingSignals \\\n    BlogEventHandlerUsingSlots\n\nCONFIG += ordered\n"
  },
  {
    "path": "EventAdmin/SignalSlot/SignalSlot.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    App \\\n    Plugins\n\nCONFIG += ordered\n"
  },
  {
    "path": "EventAdmin/SignalSlot/SignalSlot.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.13.0, 2021-03-10T11:54:18. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{c4da1889-17ad-47a8-bddc-cd90da2180db}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.2\">\n    <value type=\"QString\" key=\"language\">Nim</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">NimGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">3</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">2</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"QString\" key=\"EditorConfiguration.ignoreFileTypes\">*.md, *.MD, Makefile</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.skipTrailingWhitespace\">true</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.ActiveFrameworks\">\n    <value type=\"bool\" key=\"AutoTest.Framework.Boost\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.Catch\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.GTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtQuickTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtTest\">true</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.CheckStates\"/>\n   <value type=\"int\" key=\"AutoTest.RunAfterBuild\">0</value>\n   <value type=\"bool\" key=\"AutoTest.UseGlobal\">true</value>\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">4</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"DeviceType\">Desktop</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5151.win64_msvc2019_64_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">1</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\EventAdmin\\build-SignalSlot-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/build-SignalSlot-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\EventAdmin\\build-SignalSlot-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/build-SignalSlot-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\EventAdmin\\build-SignalSlot-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/build-SignalSlot-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"CustomOutputParsers\"/>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/SignalSlot/App/App.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/SignalSlot/App/App.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/d/mmm/qt/ctk/CTK-examples/EventAdmin/build-SignalSlot-Desktop_Qt_5_15_1_MSVC2019_64bit-Release/App/../bin</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "EventListener/EventListener.pro",
    "content": "QT += core\nQT -= gui\n\nTARGET = EventListener\nCONFIG += console\nTEMPLATE = app\n\n# CTK 安装路径\nCTK_INSTALL_PATH = $$PWD/../../CTKInstall\n\n# CTK 插件相关库所在路径（例如：CTKCore.lib、CTKPluginFramework.lib）\nCTK_LIB_PATH = $$CTK_INSTALL_PATH/lib/ctk-0.1\n\n# CTK 插件相关头文件所在路径（例如：ctkPluginFramework.h）\nCTK_INCLUDE_PATH = $$CTK_INSTALL_PATH/include/ctk-0.1\n\n# CTK 插件相关头文件所在路径（主要因为用到了 service 相关东西）\nCTK_INCLUDE_FRAMEWORK_PATH = $$PWD/../../CTK-master/Libs/PluginFramework\n\nLIBS += -L$$CTK_LIB_PATH -lCTKCore -lCTKPluginFramework\n\nINCLUDEPATH += $$CTK_INCLUDE_PATH \\\n               $$CTK_INCLUDE_FRAMEWORK_PATH\n\nSOURCES += main.cpp \\\n    event_listener.cpp\n\nHEADERS += \\\n    event_listener.h\n"
  },
  {
    "path": "EventListener/EventListener.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.13.0, 2021-03-10T12:58:33. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{c4da1889-17ad-47a8-bddc-cd90da2180db}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.2\">\n    <value type=\"QString\" key=\"language\">Nim</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">NimGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">3</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">2</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"QString\" key=\"EditorConfiguration.ignoreFileTypes\">*.md, *.MD, Makefile</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.skipTrailingWhitespace\">true</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.ActiveFrameworks\">\n    <value type=\"bool\" key=\"AutoTest.Framework.Boost\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.Catch\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.GTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtQuickTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtTest\">true</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.CheckStates\"/>\n   <value type=\"int\" key=\"AutoTest.RunAfterBuild\">0</value>\n   <value type=\"bool\" key=\"AutoTest.UseGlobal\">true</value>\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">4</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"DeviceType\">Desktop</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5151.win64_msvc2019_64_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">1</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-EventListener-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-EventListener-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-EventListener-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-EventListener-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-EventListener-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-EventListener-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"CustomOutputParsers\"/>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/ctk/CTK-examples/EventListener/EventListener.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/d/mmm/qt/ctk/CTK-examples/EventListener/EventListener.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/d/mmm/qt/ctk/CTK-examples/build-EventListener-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "EventListener/event_listener.cpp",
    "content": "﻿#include \"event_listener.h\"\n\nEventListener::EventListener(QObject *parent)\n    : QObject(parent)\n{\n}\n\nEventListener::~EventListener()\n{\n}\n\n// 监听框架事件\nvoid EventListener::onFrameworkEvent(const ctkPluginFrameworkEvent& event)\n{\n    if (!event.isNull()) {\n        QSharedPointer<ctkPlugin> plugin = event.getPlugin();\n        qDebug() << \"FrameworkEvent: [\" << plugin->getSymbolicName() << \"]\" << event.getType() << event.getErrorString();\n    } else {\n        qDebug() << \"The framework event is null\";\n    }\n}\n\n// 监听插件事件\nvoid EventListener::onPluginEvent(const ctkPluginEvent& event)\n{\n    if (!event.isNull()) {\n        QSharedPointer<ctkPlugin> plugin = event.getPlugin();\n        qDebug() << \"PluginEvent: [\" << plugin->getSymbolicName() << \"]\" << event.getType();\n    } else {\n        qDebug() << \"The plugin event is null\";\n    }\n}\n\n// 监听服务事件\nvoid EventListener::onServiceEvent(const ctkServiceEvent &event)\n{\n    if (!event.isNull()) {\n        ctkServiceReference ref = event.getServiceReference();\n        QSharedPointer<ctkPlugin> plugin = ref.getPlugin();\n        qDebug() << \"ServiceEvent: [\" << event.getType() << \"]\" << plugin->getSymbolicName() << ref.getUsingPlugins();\n    } else {\n        qDebug() << \"The service event is null\";\n    }\n}\n"
  },
  {
    "path": "EventListener/event_listener.h",
    "content": "﻿#ifndef EVENT_LISTENER_H\n#define EVENT_LISTENER_H\n\n#include <QObject>\n#include <ctkPluginFrameworkEvent.h>\n#include <ctkPluginEvent.h>\n#include <ctkServiceEvent.h>\n\nclass EventListener : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit EventListener(QObject *parent = Q_NULLPTR);\n    ~EventListener();\n\npublic slots:\n    // 监听框架事件\n    void onFrameworkEvent(const ctkPluginFrameworkEvent& event);\n    // 监听插件事件\n    void onPluginEvent(const ctkPluginEvent& event);\n    // 监听服务事件\n    void onServiceEvent(const ctkServiceEvent& event);\n};\n\n#endif // EVENT_LISTENER_H\n"
  },
  {
    "path": "EventListener/main.cpp",
    "content": "﻿#include <QCoreApplication>\n#include <QDirIterator>\n#include <QtDebug>\n\n#include <ctkPluginFrameworkFactory.h>\n#include <ctkPluginFramework.h>\n#include <ctkPluginException.h>\n#include <ctkPluginContext.h>\n\n#include \"event_listener.h\"\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication app(argc, argv);\n\n    ctkPluginFrameworkFactory frameWorkFactory;\n    QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();\n    try {\n        // 初始化并启动插件框架\n        framework->init();\n        framework->start();\n        qDebug() << \"CTK Plugin Framework start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to initialize the plugin framework: \" << e.what();\n        return -1;\n    }\n\n    // 获取插件上下文\n    ctkPluginContext* context = framework->getPluginContext();\n\n    // 事件监听\n    EventListener listener;\n    context->connectFrameworkListener(&listener, SLOT(onFrameworkEvent(ctkPluginFrameworkEvent)));\n    context->connectPluginListener(&listener, SLOT(onPluginEvent(ctkPluginEvent)));\n    // 过滤 ctkEventAdmin 服务\n    // QString filter = QString(\"(%1=%2)\").arg(ctkPluginConstants::OBJECTCLASS).arg(\"org.commontk.eventadmin\");\n    context->connectServiceListener(&listener, \"onServiceEvent\"); //, filter);\n\n    // 获取插件所在位置\n    QString path = QCoreApplication::applicationDirPath() + \"/plugins\";\n\n    // 遍历路径下的所有插件\n    QDirIterator itPlugin(path, QStringList() << \"*.dll\" << \"*.so\", QDir::Files);\n    while (itPlugin.hasNext()) {\n        QString strPlugin = itPlugin.next();\n        try {\n            // 安装插件\n            QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(strPlugin));\n            // 启动插件\n            plugin->start(ctkPlugin::START_TRANSIENT);\n        } catch (const ctkPluginException &e) {\n            return -1;\n        }\n    }\n\n    framework->stop();\n\n    return app.exec();\n}\n"
  },
  {
    "path": "GetMetaData/GetMetaData.pro",
    "content": "QT += core\nQT -= gui\nDESTDIR = $$PWD/bin\nTARGET = GetMetaData\nCONFIG += c++11 console\nCONFIG -= app_bundle\nTEMPLATE = app\n\n# CTK 安装路径\nCTK_INSTALL_PATH = $$PWD/../../CTKInstall\n\n# CTK 插件相关库所在路径（例如：CTKCore.lib、CTKPluginFramework.lib）\nCTK_LIB_PATH = $$CTK_INSTALL_PATH/lib/ctk-0.1\n\n# CTK 插件相关头文件所在路径（例如：ctkPluginFramework.h）\nCTK_INCLUDE_PATH = $$CTK_INSTALL_PATH/include/ctk-0.1\n\n# CTK 插件相关头文件所在路径（主要因为用到了 service 相关东西）\nCTK_INCLUDE_FRAMEWORK_PATH = $$PWD/../../CTK-master/Libs/PluginFramework\n\nLIBS += -L$$CTK_LIB_PATH -lCTKCore -lCTKPluginFramework\n\nINCLUDEPATH += $$CTK_INCLUDE_PATH \\\n               $$CTK_INCLUDE_FRAMEWORK_PATH\n\nSOURCES += main.cpp\n"
  },
  {
    "path": "GetMetaData/GetMetaData.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.13.0, 2021-03-08T16:36:38. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{c4da1889-17ad-47a8-bddc-cd90da2180db}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.2\">\n    <value type=\"QString\" key=\"language\">Nim</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">NimGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">3</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">2</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"QString\" key=\"EditorConfiguration.ignoreFileTypes\">*.md, *.MD, Makefile</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.skipTrailingWhitespace\">true</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.ActiveFrameworks\">\n    <value type=\"bool\" key=\"AutoTest.Framework.Boost\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.Catch\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.GTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtQuickTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtTest\">true</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.CheckStates\"/>\n   <value type=\"int\" key=\"AutoTest.RunAfterBuild\">0</value>\n   <value type=\"bool\" key=\"AutoTest.UseGlobal\">true</value>\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">4</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"DeviceType\">Desktop</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5151.win64_msvc2019_64_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">1</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-GetMetaData-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-GetMetaData-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-GetMetaData-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-GetMetaData-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-GetMetaData-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-GetMetaData-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"CustomOutputParsers\"/>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/ctk/CTK-examples/GetMetaData/GetMetaData.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/d/mmm/qt/ctk/CTK-examples/GetMetaData/GetMetaData.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/d/mmm/qt/ctk/CTK-examples/GetMetaData/bin</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "GetMetaData/main.cpp",
    "content": "#include <QCoreApplication>\n#include <QDirIterator>\n#include <QtDebug>\n#include <ctkPluginFrameworkFactory.h>\n#include <ctkPluginFramework.h>\n#include <ctkPluginException.h>\n#include <ctkPluginContext.h>\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication app(argc, argv);\n\n    ctkPluginFrameworkFactory frameWorkFactory;\n    QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();\n    try {\n        // 初始化并启动插件框架\n        framework->init();\n        framework->start();\n        qDebug() << \"CTK Plugin Framework start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to initialize the plugin framework: \" << e.what();\n        return -1;\n    }\n\n    // 获取插件上下文\n    ctkPluginContext* context = framework->getPluginContext();\n\n    // 获取插件所在位置\n    QString path = QCoreApplication::applicationDirPath() + \"/plugins\";\n\n    // 遍历路径下的所有插件\n    QDirIterator itPlugin(path, QStringList() << \"*.dll\" << \"*.so\", QDir::Files);\n    while (itPlugin.hasNext()) {\n        QString strPlugin = itPlugin.next();\n        try {\n            // 安装插件\n            QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(strPlugin));\n            qDebug() << \"Plugin install ...\";\n\n            // 获取清单头和值\n            QHash<QString, QString> headers = plugin->getHeaders();\n            qDebug() << \"Headers:\" << headers << \"\\r\\n\";\n\n            // 获取符号名\n            QString symb = plugin->getSymbolicName();\n            qDebug() << \"Symbolic Name:\" << symb << \"\\r\\n\";\n\n            // 获取版本号\n            ctkVersion version = plugin->getVersion();\n            qDebug() << \"Version:\" << version.toString()\n                     << \"Major:\" << version.getMajor()\n                     << \"Minor:\" << version.getMinor()\n                     << \"Micro:\" << version.getMicro()\n                     << \"Qualifier:\" << version.getQualifier();\n\n            // 启动插件\n            //plugin->start(ctkPlugin::START_TRANSIENT);\n        } catch (const ctkPluginException &e) {\n            qDebug() << \"Failed to install plugin\" << e.what();\n            return -1;\n        }\n    }\n\n    return app.exec();\n}\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/App/App.pro",
    "content": "QT += core gui widgets\n\nTEMPLATE = app\nCONFIG += console\nTARGET = App\nDESTDIR = $$OUT_PWD/../bin\n\ninclude($$PWD/../CTK.pri)\n\nSOURCES += \\\n    main.cpp\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/App/main.cpp",
    "content": "﻿#include <QCoreApplication>\n#include <QDirIterator>\n#include <QtDebug>\n\n#include <ctkPluginFrameworkFactory.h>\n#include <ctkPluginFramework.h>\n#include <ctkPluginException.h>\n#include <ctkPluginContext.h>\n\n#include \"../Plugin/greet_service.h\"\"\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication app(argc, argv);\n\n    ctkPluginFrameworkFactory frameWorkFactory;\n    QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();\n    try {\n        // 初始化并启动插件框架\n        framework->init();\n        framework->start();\n        qDebug() << \"CTK Plugin Framework start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to initialize the plugin framework: \" << e.what();\n        return -1;\n    }\n\n    // 获取插件上下文\n    ctkPluginContext* context = framework->getPluginContext();\n\n    // 获取插件所在位置\n    QString path = QCoreApplication::applicationDirPath() + \"/plugins\";\n\n    // 遍历路径下的所有插件\n    QDirIterator itPlugin(path, QStringList() << \"*.dll\" << \"*.so\", QDir::Files);\n    while (itPlugin.hasNext()) {\n        QString strPlugin = itPlugin.next();\n        try {\n            // 安装插件\n            QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(strPlugin));\n            // 启动插件\n            plugin->start(ctkPlugin::START_TRANSIENT);\n            qDebug() << \"Plugin start ...\";\n        } catch (const ctkPluginException &e) {\n            qDebug() << \"Failed to install plugin\" << e.what();\n            return -1;\n        }\n    }\n\n    // 获取服务引用\n    ctkServiceReference ref = context->getServiceReference<HelloService>();\n    if (ref) {\n        HelloService* service = qobject_cast<HelloService *>(context->getService(ref));\n        if (service != Q_NULLPTR)\n            service->sayHello();\n    }\n\n    ref = context->getServiceReference<ByeService>();\n    if (ref) {\n        ByeService* service = qobject_cast<ByeService *>(context->getService(ref));\n        if (service != Q_NULLPTR)\n            service->sayBye();\n    }\n\n    return app.exec();\n}\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/CTK.pri",
    "content": "# CTK 安装路径\nCTK_INSTALL_PATH = $$PWD/../../../CTKInstall\n\n# CTK 插件相关库所在路径（例如：CTKCore.lib、CTKPluginFramework.lib）\nCTK_LIB_PATH = $$CTK_INSTALL_PATH/lib/ctk-0.1\n\n# CTK 插件相关头文件所在路径（例如：ctkPluginFramework.h）\nCTK_INCLUDE_PATH = $$CTK_INSTALL_PATH/include/ctk-0.1\n\n# CTK 插件相关头文件所在路径（主要因为用到了 service 相关东西）\nCTK_INCLUDE_FRAMEWORK_PATH = $$PWD/../../../CTK-master/Libs/PluginFramework\n\nLIBS += -L$$CTK_LIB_PATH -lCTKCore -lCTKPluginFramework\n\nINCLUDEPATH += $$CTK_INCLUDE_PATH \\\n               $$CTK_INCLUDE_FRAMEWORK_PATH\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/MultipleInterfaces.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    App \\\n    Plugin\n\nCONFIG += ordered\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/MultipleInterfaces.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.13.0, 2021-03-10T10:53:25. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{c4da1889-17ad-47a8-bddc-cd90da2180db}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.2\">\n    <value type=\"QString\" key=\"language\">Nim</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">NimGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">3</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">2</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"QString\" key=\"EditorConfiguration.ignoreFileTypes\">*.md, *.MD, Makefile</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.skipTrailingWhitespace\">true</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.ActiveFrameworks\">\n    <value type=\"bool\" key=\"AutoTest.Framework.Boost\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.Catch\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.GTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtQuickTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtTest\">true</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.CheckStates\"/>\n   <value type=\"int\" key=\"AutoTest.RunAfterBuild\">0</value>\n   <value type=\"bool\" key=\"AutoTest.UseGlobal\">true</value>\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">4</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"DeviceType\">Desktop</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5151.win64_msvc2019_64_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">1</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\PluginAndService\\build-MultipleInterfaces-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/build-MultipleInterfaces-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\PluginAndService\\build-MultipleInterfaces-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/build-MultipleInterfaces-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\PluginAndService\\build-MultipleInterfaces-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/build-MultipleInterfaces-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"CustomOutputParsers\"/>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/MultipleInterfaces/App/App.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/MultipleInterfaces/App/App.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/build-MultipleInterfaces-Desktop_Qt_5_15_1_MSVC2019_64bit-Release/App/../bin</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/Plugin/MANIFEST.MF",
    "content": "Plugin-SymbolicName: Greet\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for greet\nPlugin-Name: Greet\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/Plugin/Plugin.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = Greet\nDESTDIR = $$OUT_PWD/../bin/plugins\n\ninclude($$PWD/../CTK.pri)\n\nHEADERS += \\\n    greet_service.h \\\n    greet_impl.h \\\n    greet_activator.h\n\nSOURCES += \\\n    greet_impl.cpp \\\n    greet_activator.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/Plugin/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/Greet/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/Plugin/greet_activator.cpp",
    "content": "﻿#include \"greet_impl.h\"\n#include \"greet_activator.h\"\n\nvoid GreetActivator::start(ctkPluginContext* context)\n{\n    m_pImpl = new GreetImpl();\n\n    // 注册服务\n    context->registerService<HelloService>(m_pImpl);\n    context->registerService<ByeService>(m_pImpl);\n}\n\nvoid GreetActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pImpl;\n}\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/Plugin/greet_activator.h",
    "content": "﻿#ifndef GREET_ACTIVATOR_H\n#define GREET_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass GreetImpl;\n\nclass GreetActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"GREET\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    GreetImpl *m_pImpl;\n};\n\n#endif // GREET_ACTIVATOR_H\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/Plugin/greet_impl.cpp",
    "content": "﻿#include \"greet_impl.h\"\n#include <QtDebug>\n\nGreetImpl::GreetImpl()\n{\n\n}\n\nvoid GreetImpl::sayHello()\n{\n    qDebug() << \"Hello,CTK!\";\n}\n\nvoid GreetImpl::sayBye()\n{\n    qDebug() << \"Bye,CTK!\";\n}\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/Plugin/greet_impl.h",
    "content": "﻿#ifndef GREET_IMPL_H\n#define GREET_IMPL_H\n\n#include \"greet_service.h\"\n#include <QObject>\n\nclass GreetImpl : public QObject, public HelloService, public ByeService\n{\n    Q_OBJECT\n    Q_INTERFACES(HelloService)\n    Q_INTERFACES(ByeService)\n\npublic:\n    GreetImpl();\n    void sayHello() Q_DECL_OVERRIDE;\n    void sayBye() Q_DECL_OVERRIDE;\n};\n\n#endif // GREET_IMPL_H\n"
  },
  {
    "path": "PluginAndService/MultipleInterfaces/Plugin/greet_service.h",
    "content": "﻿#ifndef GREET_SERVICE_H\n#define GREET_SERVICE_H\n\n#include <QtPlugin>\n\nclass HelloService\n{\npublic:\n    virtual ~HelloService() {}\n    virtual void sayHello() = 0;\n};\n\n#define HelloService_iid \"org.commontk.service.demos.HelloService\"\nQ_DECLARE_INTERFACE(HelloService, HelloService_iid)\n\nclass ByeService\n{\npublic:\n    virtual ~ByeService() {}\n    virtual void sayBye() = 0;\n};\n\n#define ByeService_iid \"org.commontk.service.demos.ByeService\"\nQ_DECLARE_INTERFACE(ByeService, ByeService_iid)\n\n#endif // GREET_SERVICE_H\n"
  },
  {
    "path": "PluginAndService/OneInterface/App/App.pro",
    "content": "QT += core gui widgets\n\nTEMPLATE = app\nCONFIG += console\nTARGET = App\nDESTDIR = $$OUT_PWD/../bin\n\ninclude($$PWD/../CTK.pri)\n\nSOURCES += \\\n    main.cpp\n"
  },
  {
    "path": "PluginAndService/OneInterface/App/main.cpp",
    "content": "#include <QCoreApplication>\n#include <QDirIterator>\n#include <QtDebug>\n\n#include <ctkPluginFrameworkFactory.h>\n#include <ctkPluginFramework.h>\n#include <ctkPluginException.h>\n#include <ctkPluginContext.h>\n\n#include \"../Service/welcome_service.h\"\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication app(argc, argv);\n\n    ctkPluginFrameworkFactory frameWorkFactory;\n    QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();\n    try {\n        // 初始化并启动插件框架\n        framework->init();\n        framework->start();\n        qDebug() << \"CTK Plugin Framework start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to initialize the plugin framework: \" << e.what();\n        return -1;\n    }\n\n    qDebug() << \"********************\";\n\n    // 获取插件上下文\n    ctkPluginContext* context = framework->getPluginContext();\n\n    // 获取插件所在位置\n    QString path = QCoreApplication::applicationDirPath() + \"/plugins\";\n\n    // 遍历路径下的所有插件\n    QDirIterator itPlugin(path, QStringList() << \"*.dll\" << \"*.so\", QDir::Files);\n    while (itPlugin.hasNext()) {\n        QString strPlugin = itPlugin.next();\n        try {\n            // 安装插件\n            QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(strPlugin));\n            // 启动插件\n            plugin->start(ctkPlugin::START_TRANSIENT);\n            qDebug() << \"Plugin start:\" << QFileInfo(strPlugin).fileName();\n        } catch (const ctkPluginException &e) {\n            qDebug() << \"Failed to start plugin\" << e.what();\n            return -1;\n        }\n    }\n\n    qDebug() << \"********************\";\n\n    // 1. 获取所有服务\n    QList<ctkServiceReference> refs = context->getServiceReferences<WelcomeService>();\n    foreach (ctkServiceReference ref, refs) {\n        if (ref) {\n            qDebug() << \"Name:\" << ref.getProperty(\"name\").toString()\n                     <<  \"Service ranking:\" << ref.getProperty(ctkPluginConstants::SERVICE_RANKING).toLongLong()\n                      << \"Service id:\" << ref.getProperty(ctkPluginConstants::SERVICE_ID).toLongLong();\n            WelcomeService* service = qobject_cast<WelcomeService *>(context->getService(ref));\n            if (service != Q_NULLPTR)\n                service->welcome();\n        }\n    }\n\n    qDebug() << \"********************\";\n\n    // 2. 使用过滤表达式，获取感兴趣的服务\n    refs = context->getServiceReferences<WelcomeService>(\"(&(name=CTK))\");\n    foreach (ctkServiceReference ref, refs) {\n        if (ref) {\n            WelcomeService* service = qobject_cast<WelcomeService *>(context->getService(ref));\n            if (service != Q_NULLPTR)\n                service->welcome();\n        }\n    }\n\n    qDebug() << \"********************\";\n\n    // 3. 获取某一个服务（由 Service Ranking 和 Service ID 决定）\n    ctkServiceReference ref = context->getServiceReference<WelcomeService>();\n    if (ref) {\n        WelcomeService* service = qobject_cast<WelcomeService *>(context->getService(ref));\n        if (service != Q_NULLPTR)\n            service->welcome();\n    }\n\n    return app.exec();\n}\n"
  },
  {
    "path": "PluginAndService/OneInterface/CTK.pri",
    "content": "# CTK 安装路径\nCTK_INSTALL_PATH = $$PWD/../../../CTKInstall\n\n# CTK 插件相关库所在路径（例如：CTKCore.lib、CTKPluginFramework.lib）\nCTK_LIB_PATH = $$CTK_INSTALL_PATH/lib/ctk-0.1\n\n# CTK 插件相关头文件所在路径（例如：ctkPluginFramework.h）\nCTK_INCLUDE_PATH = $$CTK_INSTALL_PATH/include/ctk-0.1\n\n# CTK 插件相关头文件所在路径（主要因为用到了 service 相关东西）\nCTK_INCLUDE_FRAMEWORK_PATH = $$PWD/../../../CTK-master/Libs/PluginFramework\n\nLIBS += -L$$CTK_LIB_PATH -lCTKCore -lCTKPluginFramework\n\nINCLUDEPATH += $$CTK_INCLUDE_PATH \\\n               $$CTK_INCLUDE_FRAMEWORK_PATH\n"
  },
  {
    "path": "PluginAndService/OneInterface/OneInterface.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    App \\\n    Plugins\n\nCONFIG += ordered\n"
  },
  {
    "path": "PluginAndService/OneInterface/OneInterface.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.13.0, 2021-03-10T10:44:37. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{c4da1889-17ad-47a8-bddc-cd90da2180db}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.2\">\n    <value type=\"QString\" key=\"language\">Nim</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">NimGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">3</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">2</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"QString\" key=\"EditorConfiguration.ignoreFileTypes\">*.md, *.MD, Makefile</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.skipTrailingWhitespace\">true</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.ActiveFrameworks\">\n    <value type=\"bool\" key=\"AutoTest.Framework.Boost\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.Catch\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.GTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtQuickTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtTest\">true</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.CheckStates\"/>\n   <value type=\"int\" key=\"AutoTest.RunAfterBuild\">0</value>\n   <value type=\"bool\" key=\"AutoTest.UseGlobal\">true</value>\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">4</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"DeviceType\">Desktop</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5151.win64_msvc2019_64_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">1</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\PluginAndService\\build-OneInterface-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/build-OneInterface-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\PluginAndService\\build-OneInterface-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/build-OneInterface-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\PluginAndService\\build-OneInterface-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/build-OneInterface-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"CustomOutputParsers\"/>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/OneInterface/App/App.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/OneInterface/App/App.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/d/mmm/qt/ctk/CTK-examples/PluginAndService/build-OneInterface-Desktop_Qt_5_15_1_MSVC2019_64bit-Release/App/../bin</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/Plugins.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    WelcomeCTK \\\n    WelcomeQt\n\nCONFIG += ordered\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeCTK/MANIFEST.MF",
    "content": "Plugin-SymbolicName: Welcome.CTK\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for welcome CTK\nPlugin-Name: WelcomeCTK\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeCTK/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/WelcomeCTK/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeCTK/WelcomeCTK.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = WelcomeCTK\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    welcome_ctk_impl.h \\\n    welcome_ctk_activator.h\n\nSOURCES += \\\n    welcome_ctk_impl.cpp \\\n    welcome_ctk_activator.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeCTK/welcome_ctk_activator.cpp",
    "content": "﻿#include \"welcome_ctk_impl.h\"\n#include \"welcome_ctk_activator.h\"\n#include <QtDebug>\n\nvoid WelcomeCTKActivator::start(ctkPluginContext* context)\n{\n    ctkDictionary properties;\n    properties.insert(ctkPluginConstants::SERVICE_RANKING, 2);\n    properties.insert(\"name\", \"CTK\");\n\n    m_pImpl = new WelcomeCTKImpl();\n    context->registerService<WelcomeService>(m_pImpl, properties);\n}\n\nvoid WelcomeCTKActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pImpl;\n}\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeCTK/welcome_ctk_activator.h",
    "content": "﻿#ifndef WELCOME_CTK_ACTIVATOR_H\n#define WELCOME_CTK_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass WelcomeCTKImpl;\n\nclass WelcomeCTKActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"WELCOME_CTK\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    WelcomeCTKImpl *m_pImpl;\n};\n\n#endif // WELCOME_CTK_ACTIVATOR_H\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeCTK/welcome_ctk_impl.cpp",
    "content": "﻿#include \"welcome_ctk_impl.h\"\n#include <QtDebug>\n\nWelcomeCTKImpl::WelcomeCTKImpl()\n{\n\n}\n\nvoid WelcomeCTKImpl::welcome()\n{\n    qDebug() << \"Welcome CTK!\";\n}\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeCTK/welcome_ctk_impl.h",
    "content": "﻿#ifndef WELCOME_CTK_IMPL_H\n#define WELCOME_CTK_IMPL_H\n\n#include \"../../Service/welcome_service.h\"\n#include <QObject>\n\nclass ctkPluginContext;\n\nclass WelcomeCTKImpl : public QObject, public WelcomeService\n{\n    Q_OBJECT\n    Q_INTERFACES(WelcomeService)\n\npublic:\n    WelcomeCTKImpl();\n    void welcome() Q_DECL_OVERRIDE;\n};\n\n#endif // WELCOME_CTK_IMPL_H\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeQt/MANIFEST.MF",
    "content": "Plugin-SymbolicName: Welcome.Qt\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for welcome Qt\nPlugin-Name: WelcomeQt\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeQt/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/WelcomeQt/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeQt/WelcomeQt.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = WelcomeQt\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    welcome_qt_impl.h \\\n    welcome_qt_activator.h\n\nSOURCES += \\\n    welcome_qt_impl.cpp \\\n    welcome_qt_activator.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeQt/welcome_qt_activator.cpp",
    "content": "#include \"welcome_qt_impl.h\"\n#include \"welcome_qt_activator.h\"\n#include <QtDebug>\n\nvoid WelcomeQtActivator::start(ctkPluginContext* context)\n{\n    ctkDictionary properties;\n    properties.insert(ctkPluginConstants::SERVICE_RANKING, 1);\n    properties.insert(\"name\", \"Qt\");\n\n    m_pImpl = new WelcomeQtImpl();\n    context->registerService<WelcomeService>(m_pImpl, properties);\n}\n\nvoid WelcomeQtActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pImpl;\n}\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeQt/welcome_qt_activator.h",
    "content": "﻿#ifndef WELCOME_CTK_ACTIVATOR_H\n#define WELCOME_CTK_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass WelcomeQtImpl;\n\nclass WelcomeQtActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"WELCOME_QT\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    WelcomeQtImpl *m_pImpl;\n};\n\n#endif // WELCOME_CTK_ACTIVATOR_H\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeQt/welcome_qt_impl.cpp",
    "content": "﻿#include \"welcome_qt_impl.h\"\n#include <QtDebug>\n\nWelcomeQtImpl::WelcomeQtImpl()\n{\n\n}\n\nvoid WelcomeQtImpl::welcome()\n{\n    qDebug() << \"Welcome Qt!\";\n}\n"
  },
  {
    "path": "PluginAndService/OneInterface/Plugins/WelcomeQt/welcome_qt_impl.h",
    "content": "﻿#ifndef WELCOME_QT_IMPL_H\n#define WELCOME_QT_IMPL_H\n\n#include \"../../Service/welcome_service.h\"\n#include <QObject>\n\nclass ctkPluginContext;\n\nclass WelcomeQtImpl : public QObject, public WelcomeService\n{\n    Q_OBJECT\n    Q_INTERFACES(WelcomeService)\n\npublic:\n    WelcomeQtImpl();\n    void welcome() Q_DECL_OVERRIDE;\n};\n\n#endif // WELCOME_QT_IMPL_H\n"
  },
  {
    "path": "PluginAndService/OneInterface/Service/welcome_service.h",
    "content": "﻿#ifndef WELCOME_SERVICE_H\n#define WELCOME_SERVICE_H\n\n#include <QtPlugin>\n\nclass WelcomeService\n{\npublic:\n    virtual ~WelcomeService() {}\n    virtual void welcome() = 0;\n};\n\n#define WelcomeService_iid \"org.commontk.service.demos.WelcomeService\"\nQ_DECLARE_INTERFACE(WelcomeService, WelcomeService_iid)\n\n#endif // WELCOME_SERVICE_H\n"
  },
  {
    "path": "README.md",
    "content": "[CTK完整教程(OSGI for C++ 实现 C++ Qt 模块化)](https://www.ljjyy.com/archives/2021/03/100645.html)\n\nCTK框架实际应用比较可靠，但网上资料很少。本教程围绕 CTK Plugin Framework，探索 C++ 中的模块化技术，并能够基于 CTK 快速搭建 C++ 组件化框架，避免后来的人走弯路。本教程的源码下载地址：[项目源代码](https://github.com/myhhub/CTK-project)。\n\n# CTK介绍\n\n[CTK](http://www.commontk.org/) 为支持生物医学图像计算的公共开发包，其全称为 Common Toolkit。CTK插件框架的设计有很大的灵感来自OSGi并且使得应用程序由许多不同的组件组合成一个可扩展模型。这个模型允许通过那些组件间共享对象的服务通信。\n\n当前，CTK 工作的主要范围包括：\n\n- [DICOM](http://www.commontk.org/index.php/Documentation/Dicom_Overview)：提供了从 PACS 和本地数据库中查询和检索的高级类。包含 Qt 部件，可以轻松地设置服务器连接，并发送查询和查看结果。\n\n- [DICOM Application Hosting](http://www.commontk.org/index.php/Documentation/DicomApplicationHosting)：目标是创建 DICOM Part 19 Application Hosting specifications 的 C++ 参考实现。它提供了用于创建主机和托管应用程序的基础设。\n\n- [Widgets](http://www.commontk.org/index.php/Documentation/Widgets)：用于生物医学成像应用的 Qt Widgets 集合。\n\n- [Plugin Framework](http://www.commontk.org/index.php/Documentation/Plugin_Framework)：用于 C++ 的动态组件系统，以 OSGi 规范为模型。它支持一个开发模型，在这个模型中，应用程序（动态地）由许多不同（可重用的）组件组成，遵循面向服务的方法。\n\n- [Command Line Interfaces](http://www.commontk.org/index.php/Documentation/Command_Line_Interface)：一种允许将算法编写为自包含可执行程序的技术，可以在多个终端用户应用程序环境中使用，而无需修改。\n\n  ## 使用 CTK Plugin Framework 的好处\n\n  由于 CTK Plugin Framework 基于 OSGi，因此它继承了一种非常成熟且完全设计的组件系统，这在 Java 中用于构建高度复杂的应用程序，它将这些好处带给了本地（基于 Qt 的）C++ 应用程序。以下内容摘自 [Benefits of Using OSGi](https://www.osgi.org/developer/benefits-of-using-osgi/)，并适应于 CTK Plugin Framework：\n\n- 降低复杂性\n\n  使用 CTK Plugin Framework 开发意味着开发插件，它们隐藏了内部实现，并通过定义良好的服务来和其它插件通信。隐藏内部机制意味着以后可以自由地更改实现，这不仅有助于 Bug 数量的减少，还使得插件的开发变得更加简单，因为只需要实现已经定义好的一定数量的功能接口即可。\n\n- 复用\n\n  标准化的组件模型，使得在应用程序中使用第三方组件变得非常容易。\n\n- 现实情况\n\n  CTK Plugin Framework 是一个动态框架，它可以动态地更新插件和服务。在现实世界中，有很多场景都和动态服务模型相匹配。因此，应用程序可以在其所属的领域中重用 Service Registry 的强大基元（注册、获取、用富有表现力的过滤语言列表、等待服务的出现和消失）。这不仅节省了编写代码，还提供了全局可见性、调试工具以及比为专用解决方案实现的更多的功能。在这样的动态环境下编写代码听起来似乎是个噩梦，但幸运的是，有支持类和框架可以消除大部分（如果不是全部的话）痛苦。\n\n- 开发简单\n\n  CTK Plugin Framework 不仅仅是组件的标准，它还指定了如何安装和管理组件。这个 API 可以被插件用来提供一个管理代理，这个管理代理可以非常简单，如命令 shell、图形桌面应用程序、Amazon EC2 的云计算接口、或 IBM Tivoli 管理系统。标准化的管理 API 使得在现有和未来的系统中集成 CTK Plugin Framework 变得非常容易。\n\n- 动态更新\n\n  OSGi 组件模型是一个动态模型，插件可以在不关闭整个系统的情况下被安装、启动、停止、更新和卸载。\n\n- 自适应\n\n  OSGi 组件模型是从头设计的，以允许组件的混合和匹配。这就要求必须指定组件的依赖关系，并且需要组件在其可选依赖性并不总是可用的环境中生存。Service Registry 是一个动态注册表，其中插件可以注册、获取和监听服务。这种动态服务模型允许插件找出系统中可用的功能，并调整它们所能提供的功能。这使得代码更加灵活，并且能够更好地适应变化。\n\n- 透明性\n\n  插件和服务是 CTK 插件环境中的一等公民。管理 API 提供了对插件的内部状态的访问，以及插件之间的连接方式。可以停止部分应用程序来调试某个问题，或者可以引入诊断插件。\n\n- 版本控制\n\n  在 CTK Plugin Framework 中，所有的插件都经过严格的版本控制，只有能够协作的插件才会被连接在一起。\n\n- 简单\n\n  CTK 插件相关的 API 非常简单，核心 API 不到 25 个类。这个核心 API 足以编写插件、安装、启动、停止、更新和卸载它们，并且还包含了所有的监听类。\n\n- 懒加载\n\n  懒加载是软件中一个很好的点，OSGi 技术有很多的机制来保证只有当类真正需要的时候才开始加载它们。例如，插件可以用饿汉式启动，但是也可以被配置为仅当其它插件使用它们时才启动。服务可以被注册，但只有在使用时才创建。这些懒加载场景，可以节省大量的运行时成本。\n\n- 非独占性\n\n  CTK Plugin Framework 不会接管整个应用程序，你可以选择性地将所提供的功能暴露给应用程序的某些部分，或者甚至可以在同一个进程中运行该框架的多个实例。\n\n- 非侵入\n\n  在一个 CTK 插件环境中，不同插件均有自己的环境。它们可以使用任何设施，框架对此并无限制。CTK 服务没有特殊的接口需求，每个 QObject 都可以作为一个服务，每个类（也包括非 QObject）都可以作为一个接口。\n\n# CTK编译\n\n使用cmake编译出与系统版本相应的动态库。参见[CTK编译教程(64位环境 Windows + Qt + MinGW或MSVC + CMake)](https://www.ljjyy.com/archives/2021/02/100643.html)。\n\n# [使用 CTK](https://www.ljjyy.com/archives/2021/03/100645.html)\n- [使用 CTKWidgets](https://www.ljjyy.com/archives/2021/03/100645.html#%E4%BD%BF%E7%94%A8-CTKWidgets)\n- [使用 CTK Plugin Framework](https://www.ljjyy.com/archives/2021/03/100645.html#%E5%88%9D%E6%AD%A5%E4%BD%BF%E7%94%A8-CTK-Plugin-Framework)\n- [CTK 插件间通信.注册接口调用](https://www.ljjyy.com/archives/2021/03/100645.html#%E9%80%9A%E4%BF%A1%E6%96%B9%E6%B3%95%E4%B8%80-%E6%B3%A8%E5%86%8C%E6%8E%A5%E5%8F%A3%E8%B0%83%E7%94%A8)\n- [CTK 插件和服务](https://www.ljjyy.com/archives/2021/03/100645.html#%E6%8E%A5%E5%8F%A3%E3%80%81%E6%8F%92%E4%BB%B6%E3%80%81%E6%9C%8D%E5%8A%A1%E7%9A%84%E5%85%B3%E7%B3%BB)\n- [CTK 插件间通信.事件监听](https://www.ljjyy.com/archives/2021/03/100645.html#%E9%80%9A%E4%BF%A1%E6%96%B9%E6%B3%95%E4%BA%8C-%E4%BA%8B%E4%BB%B6%E7%9B%91%E5%90%AC)\n- [CTK 事件管理机制](https://www.ljjyy.com/archives/2021/03/100645.html#%E4%BA%8B%E4%BB%B6%E5%8F%91%E9%80%81%E6%96%B9%E5%BC%8F-%E7%B1%BB%E9%80%9A%E4%BF%A1%E3%80%81%E4%BF%A1%E5%8F%B7%E6%A7%BD%E9%80%9A%E4%BF%A1)\n- [CTK 插件元数据](https://www.ljjyy.com/archives/2021/03/100645.html#%E6%8F%92%E4%BB%B6%E5%85%83%E6%95%B0%E6%8D%AE)\n- [CTK 插件之间的依赖](https://www.ljjyy.com/archives/2021/03/100645.html#%E6%8F%92%E4%BB%B6%E4%BE%9D%E8%B5%96)\n- [CTK 服务工厂](https://www.ljjyy.com/archives/2021/03/100645.html#CTK-%E6%9C%8D%E5%8A%A1%E5%B7%A5%E5%8E%82)\n- [CTK 事件与监听](https://www.ljjyy.com/archives/2021/03/100645.html#CTK-%E4%BA%8B%E4%BB%B6%E7%9B%91%E5%90%AC)\n- [CTK 服务追踪](https://www.ljjyy.com/archives/2021/03/100645.html#CTK-%E6%9C%8D%E5%8A%A1%E8%BF%BD%E8%B8%AA)\n"
  },
  {
    "path": "RequirePlugin/App/App.pro",
    "content": "QT += core\nQT -= gui\n\nTARGET = RequirePlugin\nCONFIG += console\nTEMPLATE = app\nDESTDIR = $$OUT_PWD/../bin\n\ninclude($$PWD/../CTK.pri)\n\nSOURCES += main.cpp\n"
  },
  {
    "path": "RequirePlugin/App/main.cpp",
    "content": "#include <QCoreApplication>\n#include <QDirIterator>\n#include <QtDebug>\n\n#include <ctkPluginFrameworkFactory.h>\n#include <ctkPluginFramework.h>\n#include <ctkPluginException.h>\n#include <ctkPluginContext.h>\n\n#include \"../Plugins/PluginA/plugin_a_service.h\"\n#include \"../Plugins/PluginB/plugin_b_service.h\"\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication app(argc, argv);\n\n    ctkPluginFrameworkFactory frameWorkFactory;\n    QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();\n    try {\n        // 初始化并启动插件框架\n        framework->init();\n        framework->start();\n        qDebug() << \"CTK Plugin Framework start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to initialize the plugin framework: \" << e.what();\n        return -1;\n    }\n\n    // 获取插件上下文\n    ctkPluginContext* context = framework->getPluginContext();\n\n    // 获取插件所在位置\n    QString path = QCoreApplication::applicationDirPath() + \"/plugins\";\n\n    // 启动插件 A\n    try {\n        QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(path + \"/PluginA.dll\"));\n        plugin->start();\n        qDebug() << \"PluginA start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to start PluginA\" << e.what();\n    }\n\n    // 启动插件 B\n    try {\n        QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(path + \"/PluginB.dll\"));\n        plugin->start();\n        qDebug() << \"PluginB start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to start PluginB\" << e.what();\n    }\n\n    // 获取服务引用\n    ctkServiceReference reference = context->getServiceReference<PluginAService>();\n    if (reference) {\n        // 获取指定 ctkServiceReference 引用的服务对象\n        PluginAService* service = qobject_cast<PluginAService *>(context->getService(reference));\n        if (service != Q_NULLPTR) {\n            // 调用服务\n            service->doSomething();\n        }\n    }\n\n    reference = context->getServiceReference<PluginBService>();\n    if (reference) {\n        // 获取指定 ctkServiceReference 引用的服务对象\n        PluginBService* service = qobject_cast<PluginBService *>(context->getService(reference));\n        if (service != Q_NULLPTR) {\n            // 调用服务\n            service->doSomething();\n        }\n    }\n\n    return app.exec();\n}\n"
  },
  {
    "path": "RequirePlugin/CTK.pri",
    "content": "# CTK 安装路径\nCTK_INSTALL_PATH = $$PWD/../../CTKInstall\n\n# CTK 插件相关库所在路径（例如：CTKCore.lib、CTKPluginFramework.lib）\nCTK_LIB_PATH = $$CTK_INSTALL_PATH/lib/ctk-0.1\n\n# CTK 插件相关头文件所在路径（例如：ctkPluginFramework.h）\nCTK_INCLUDE_PATH = $$CTK_INSTALL_PATH/include/ctk-0.1\n\n# CTK 插件相关头文件所在路径（主要因为用到了 service 相关东西）\nCTK_INCLUDE_FRAMEWORK_PATH = $$PWD/../../CTK-master/Libs/PluginFramework\n\nLIBS += -L$$CTK_LIB_PATH -lCTKCore -lCTKPluginFramework\n\nINCLUDEPATH += $$CTK_INCLUDE_PATH \\\n               $$CTK_INCLUDE_FRAMEWORK_PATH\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginA/MANIFEST.MF",
    "content": "﻿Plugin-SymbolicName: Plugin.A\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for test\nPlugin-Name: PluginA\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginA/PluginA.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = PluginA\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    plugin_a_service.h \\\n    plugin_a_impl.h \\\n    plugin_a_activator.h\n\nSOURCES += \\\n    plugin_a_impl.cpp \\\n    plugin_a_activator.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginA/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/PluginA/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginA/plugin_a_activator.cpp",
    "content": "﻿#include \"plugin_a_impl.h\"\n#include \"plugin_a_activator.h\"\n#include <ctkPluginContext.h>\n\nvoid PluginAActivator::start(ctkPluginContext* context)\n{\n    m_pPlugin = new PluginAImpl();\n    context->registerService<PluginAService>(m_pPlugin);\n}\n\nvoid PluginAActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pPlugin;\n    m_pPlugin = Q_NULLPTR;\n}\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginA/plugin_a_activator.h",
    "content": "﻿#ifndef PLUGIN_A_ACTIVATOR_H\n#define PLUGIN_A_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass PluginAImpl;\n\nclass PluginAActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"PLUGIN_A\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    PluginAImpl *m_pPlugin;\n};\n\n#endif // PLUGIN_A_ACTIVATOR_H\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginA/plugin_a_impl.cpp",
    "content": "﻿#include \"plugin_a_impl.h\"\n#include <QtDebug>\n\nPluginAImpl::PluginAImpl()\n{\n\n}\n\nvoid PluginAImpl::doSomething()\n{\n    qDebug() << \"Do something...A\";\n}\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginA/plugin_a_impl.h",
    "content": "﻿#ifndef PLUGIN_A_IMPL_H\n#define PLUGIN_A_IMPL_H\n\n#include \"plugin_a_service.h\"\n#include <QObject>\n\nclass PluginAImpl : public QObject, public PluginAService\n{\n    Q_OBJECT\n    Q_INTERFACES(PluginAService)\n\npublic:\n    PluginAImpl();\n    void doSomething() Q_DECL_OVERRIDE;\n};\n\n#endif // PLUGIN_A_IMPL_H\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginA/plugin_a_service.h",
    "content": "﻿#ifndef PLUGIN_A_SERVICE_H\n#define PLUGIN_A_SERVICE_H\n\n#include <QtPlugin>\n\nclass PluginAService\n{\npublic:\n    virtual ~PluginAService() {}\n    virtual void doSomething() = 0;\n};\n\n#define PluginAService_iid \"org.commontk.service.demos.PluginAService\"\nQ_DECLARE_INTERFACE(PluginAService, PluginAService_iid)\n\n#endif // PLUGIN_A_SERVICE_H\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginB/MANIFEST.MF",
    "content": "Plugin-SymbolicName: Plugin.B\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for test\nPlugin-Name: PluginB\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0\nRequire-Plugin: Plugin.A; resolution:=\"mandatory\"; plugin-version=\"[1.0,2.0)\"\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginB/PluginB.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = PluginB\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    plugin_b_service.h \\\n    plugin_b_impl.h \\\n    plugin_b_activator.h\n\nSOURCES += \\\n    plugin_b_impl.cpp \\\n    plugin_b_activator.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginB/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/PluginB/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginB/plugin_b_activator.cpp",
    "content": "﻿#include \"plugin_b_impl.h\"\n#include \"plugin_b_activator.h\"\n#include <ctkPluginContext.h>\n\nvoid PluginBActivator::start(ctkPluginContext* context)\n{\n    m_pPlugin = new PluginBImpl();\n    context->registerService<PluginBService>(m_pPlugin);\n}\n\nvoid PluginBActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pPlugin;\n    m_pPlugin = Q_NULLPTR;\n}\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginB/plugin_b_activator.h",
    "content": "﻿#ifndef PLUGIN_B_ACTIVATOR_H\n#define PLUGIN_B_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass PluginBImpl;\n\nclass PluginBActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"PLUGIN_B\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    PluginBImpl *m_pPlugin;\n};\n\n#endif // PLUGIN_B_ACTIVATOR_H\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginB/plugin_b_impl.cpp",
    "content": "﻿#include \"plugin_b_impl.h\"\n#include <QtDebug>\n\nPluginBImpl::PluginBImpl()\n{\n\n}\n\nvoid PluginBImpl::doSomething()\n{\n    qDebug() << \"Do something...B\";\n}\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginB/plugin_b_impl.h",
    "content": "﻿#ifndef PLUGIN_B_IMPL_H\n#define PLUGIN_B_IMPL_H\n\n#include \"plugin_b_service.h\"\n#include <QObject>\n\nclass PluginBImpl : public QObject, public PluginBService\n{\n    Q_OBJECT\n    Q_INTERFACES(PluginBService)\n\npublic:\n    PluginBImpl();\n    void doSomething() Q_DECL_OVERRIDE;\n};\n\n#endif // PLUGIN_B_IMPL_H\n"
  },
  {
    "path": "RequirePlugin/Plugins/PluginB/plugin_b_service.h",
    "content": "﻿#ifndef PLUGIN_B_SERVICE_H\n#define PLUGIN_B_SERVICE_H\n\n#include <QtPlugin>\n\nclass PluginBService\n{\npublic:\n    virtual ~PluginBService() {}\n    virtual void doSomething() = 0;\n};\n\n#define PluginBService_iid \"org.commontk.service.demos.PluginBService\"\nQ_DECLARE_INTERFACE(PluginBService, PluginBService_iid)\n\n#endif // PLUGIN_B_SERVICE_H\n"
  },
  {
    "path": "RequirePlugin/Plugins/Plugins.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    PluginA \\\n    PluginB\n\nCONFIG += ordered\n"
  },
  {
    "path": "RequirePlugin/RequirePlugin.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    App \\\n    Plugins\n\nCONFIG += ordered\n"
  },
  {
    "path": "RequirePlugin/RequirePlugin.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.13.0, 2021-03-09T09:00:13. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{c4da1889-17ad-47a8-bddc-cd90da2180db}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.2\">\n    <value type=\"QString\" key=\"language\">Nim</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">NimGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">3</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">2</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"QString\" key=\"EditorConfiguration.ignoreFileTypes\">*.md, *.MD, Makefile</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.skipTrailingWhitespace\">true</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.ActiveFrameworks\">\n    <value type=\"bool\" key=\"AutoTest.Framework.Boost\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.Catch\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.GTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtQuickTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtTest\">true</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.CheckStates\"/>\n   <value type=\"int\" key=\"AutoTest.RunAfterBuild\">0</value>\n   <value type=\"bool\" key=\"AutoTest.UseGlobal\">true</value>\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">4</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"DeviceType\">Desktop</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5151.win64_msvc2019_64_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">1</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-RequirePlugin-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-RequirePlugin-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-RequirePlugin-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-RequirePlugin-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-RequirePlugin-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-RequirePlugin-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"CustomOutputParsers\"/>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/ctk/CTK-examples/RequirePlugin/App/App.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/d/mmm/qt/ctk/CTK-examples/RequirePlugin/App/App.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/d/mmm/qt/ctk/CTK-examples/build-RequirePlugin-Desktop_Qt_5_15_1_MSVC2019_64bit-Release/App/../bin</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "SampleCTK/App/App.pro",
    "content": "QT += core\nQT -= gui\n\nTARGET = App\nCONFIG += console\nTEMPLATE = app\nDESTDIR = $$OUT_PWD/../bin\n\ninclude($$PWD/../CTK.pri)\n\nSOURCES += main.cpp\n"
  },
  {
    "path": "SampleCTK/App/main.cpp",
    "content": "#include <QCoreApplication>\n#include <QDirIterator>\n#include <QtDebug>\n#include <ctkPluginFrameworkFactory.h>\n#include <ctkPluginFramework.h>\n#include <ctkPluginException.h>\n#include <ctkPluginContext.h>\n#include \"../HelloCTK/hello_service.h\"\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication app(argc, argv);\n    app.setApplicationName(\"SampleCTK\");//给框架创建名称，Linux下没有会报错\n    ctkPluginFrameworkFactory frameWorkFactory;\n    QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();\n    try {\n        // 初始化并启动插件框架\n        framework->init();\n        framework->start();\n        qDebug() << \"CTK Plugin Framework start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to initialize the plugin framework: \" << e.what();\n        qDebug() << e.message() << e.getType();\n        return -1;\n    }\n\n    // 获取插件上下文\n    ctkPluginContext* context = framework->getPluginContext();\n\n    // 获取插件所在位置\n    QString path = QCoreApplication::applicationDirPath() + \"/plugins\";\n    qDebug() << path;\n\n    // 遍历路径下的所有插件\n    QDirIterator itPlugin(path, QStringList() << \"*.dll\" << \"*.so\", QDir::Files);\n    while (itPlugin.hasNext()) {\n        QString strPlugin = itPlugin.next();\n        try {\n            // 安装插件\n            QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(strPlugin));\n            // 启动插件\n            plugin->start(ctkPlugin::START_TRANSIENT);\n            qDebug() << \"Plugin start ...\";\n        } catch (const ctkPluginException &e) {\n            qDebug() << \"Failed to install plugin\" << e.what();\n            return -1;\n        }\n    }\n\n    // 获取服务引用\n    ctkServiceReference reference = context->getServiceReference<HelloService>();\n    if (reference) {\n        // 获取指定 ctkServiceReference 引用的服务对象\n        HelloService* service = qobject_cast<HelloService *>(context->getService(reference));\n        if (service != Q_NULLPTR) {\n            // 调用服务\n            service->sayHello();\n        }\n    }\n\n    return app.exec();\n}\n"
  },
  {
    "path": "SampleCTK/CTK.pri",
    "content": "# CTK 安装路径\nCTK_INSTALL_PATH = $$PWD/../../CTKInstall\n\n# CTK 插件相关库所在路径（例如：CTKCore.lib、CTKPluginFramework.lib）\nCTK_LIB_PATH = $$CTK_INSTALL_PATH/lib/ctk-0.1\n\n# CTK 插件相关头文件所在路径（例如：ctkPluginFramework.h）\nCTK_INCLUDE_PATH = $$CTK_INSTALL_PATH/include/ctk-0.1\n\n# CTK 插件相关头文件所在路径（主要因为用到了 service 相关东西）\nCTK_INCLUDE_FRAMEWORK_PATH = $$PWD/../../CTK-master/Libs/PluginFramework\n\nLIBS += -L$$CTK_LIB_PATH -lCTKCore -lCTKPluginFramework\n\nINCLUDEPATH += $$CTK_INCLUDE_PATH \\\n               $$CTK_INCLUDE_FRAMEWORK_PATH\n"
  },
  {
    "path": "SampleCTK/HelloCTK/HelloCTK.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = HelloCTK\nDESTDIR = $$OUT_PWD/../bin/plugins\n\ninclude($$PWD/../CTK.pri)\n\nfile.path = $$DESTDIR\nfile.files = MANIFEST.MF\nINSTALLS += file\n\nRESOURCES += \\\n    Resource.qrc\n\nHEADERS += \\\n    hello_activator.h \\\n    hello_impl.h \\\n    hello_service.h\n\nSOURCES += \\\n    hello_activator.cpp \\\n    hello_impl.cpp\n"
  },
  {
    "path": "SampleCTK/HelloCTK/MANIFEST.MF",
    "content": "Plugin-SymbolicName: HelloCTK\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for say hello\nPlugin-Name: HelloCTK\nPlugin-Vendor: myh\nPlugin-Version: 1.2.4\n"
  },
  {
    "path": "SampleCTK/HelloCTK/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/HelloCTK/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>"
  },
  {
    "path": "SampleCTK/HelloCTK/hello_activator.cpp",
    "content": "#include \"hello_activator.h\"\n#include \"hello_impl.h\"\n\nvoid HelloActivator::start(ctkPluginContext* context)\n{\n    s.reset(new HelloImpl(context));\n//    HelloImpl* helloImpl = new HelloImpl();\n//    context->registerService<HelloService>(helloImpl);\n//    s.reset(helloImpl);\n}\n\nvoid HelloActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n}\n"
  },
  {
    "path": "SampleCTK/HelloCTK/hello_activator.h",
    "content": "﻿#ifndef HELLO_ACTIVATOR_H\n#define HELLO_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n#include \"hello_service.h\"\n\nclass HelloActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"HELLO_CTK\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    QScopedPointer<HelloService> s;\n};\n\n#endif // HELLO_ACTIVATOR_H\n"
  },
  {
    "path": "SampleCTK/HelloCTK/hello_impl.cpp",
    "content": "#include \"hello_impl.h\"\n#include <ctkPluginContext.h>\n#include <QtDebug>\n\nHelloImpl::HelloImpl(ctkPluginContext* context)\n{\n    context->registerService<HelloService>(this);\n}\n\nvoid HelloImpl::sayHello()\n{\n    qDebug() << \"Hello,CTK!\";\n}\n"
  },
  {
    "path": "SampleCTK/HelloCTK/hello_impl.h",
    "content": "﻿#ifndef HELLO_IMPL_H\n#define HELLO_IMPL_H\n\n#include \"hello_service.h\"\n#include <QObject>\n\nclass ctkPluginContext;\n\nclass HelloImpl : public QObject, public HelloService\n{\n    Q_OBJECT\n    Q_INTERFACES(HelloService)\n\npublic:\n    HelloImpl(ctkPluginContext* context);\n    void sayHello() Q_DECL_OVERRIDE;\n};\n\n#endif // HELLO_IMPL_H\n"
  },
  {
    "path": "SampleCTK/HelloCTK/hello_service.h",
    "content": "﻿#ifndef HELLO_SERVICE_H\n#define HELLO_SERVICE_H\n\n#include <QtPlugin>\n\nclass HelloService\n{\npublic:\n    virtual ~HelloService() {}\n    virtual void sayHello() = 0;\n};\n\n#define HelloService_iid \"org.commontk.service.demos.HelloService\"\nQ_DECLARE_INTERFACE(HelloService, HelloService_iid)\n\n#endif // HELLO_SERVICE_H\n"
  },
  {
    "path": "SampleCTK/SampleCTK.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    App \\\n    HelloCTK\n"
  },
  {
    "path": "SampleCTK/SampleCTK.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.13.0, 2021-03-10T10:20:48. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{c4da1889-17ad-47a8-bddc-cd90da2180db}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.2\">\n    <value type=\"QString\" key=\"language\">Nim</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">NimGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">3</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">2</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"QString\" key=\"EditorConfiguration.ignoreFileTypes\">*.md, *.MD, Makefile</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.skipTrailingWhitespace\">true</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.ActiveFrameworks\">\n    <value type=\"bool\" key=\"AutoTest.Framework.Boost\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.Catch\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.GTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtQuickTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtTest\">true</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.CheckStates\"/>\n   <value type=\"int\" key=\"AutoTest.RunAfterBuild\">0</value>\n   <value type=\"bool\" key=\"AutoTest.UseGlobal\">true</value>\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">4</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"DeviceType\">Desktop</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5151.win64_msvc2019_64_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">1</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-SampleCTK-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-SampleCTK-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-SampleCTK-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-SampleCTK-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-SampleCTK-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-SampleCTK-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"CustomOutputParsers\"/>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/ctk/CTK-examples/SampleCTK/App/App.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/d/mmm/qt/ctk/CTK-examples/SampleCTK/App/App.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/d/mmm/qt/ctk/CTK-examples/build-SampleCTK-Desktop_Qt_5_15_1_MSVC2019_64bit-Release/App/../bin</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "ServiceFactory/App/App.pro",
    "content": "QT += core\nQT -= gui\n\nTARGET = ServiceFactory\nCONFIG += console\nTEMPLATE = app\nDESTDIR = $$OUT_PWD/../bin\n\ninclude($$PWD/../CTK.pri)\n\nSOURCES += main.cpp\n"
  },
  {
    "path": "ServiceFactory/App/main.cpp",
    "content": "#include <QCoreApplication>\n#include <QDirIterator>\n#include <QtDebug>\n\n#include <ctkPluginFrameworkFactory.h>\n#include <ctkPluginFramework.h>\n#include <ctkPluginException.h>\n#include <ctkPluginContext.h>\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication app(argc, argv);\n\n    ctkPluginFrameworkFactory frameWorkFactory;\n    QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();\n    try {\n        // 初始化并启动插件框架\n        framework->init();\n        framework->start();\n        qDebug() << \"CTK Plugin Framework start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to initialize the plugin framework: \" << e.what();\n        return -1;\n    }\n\n    // 获取插件上下文\n    ctkPluginContext* context = framework->getPluginContext();\n\n    // 获取插件所在位置\n    QString path = QCoreApplication::applicationDirPath() + \"/plugins\";\n\n    // 启动插件 Hello\n    try {\n        QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(path + \"/Hello.dll\"));\n        plugin->start();\n        qDebug() << \"Hello plugin start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to start Hello\" << e.what();\n    }\n\n    // 启动插件 A\n    try {\n        QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(path + \"/PluginA.dll\"));\n        plugin->start();\n        qDebug() << \"PluginA start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to start PluginA\" << e.what();\n    }\n\n    // 启动插件 B\n    try {\n       QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(path + \"/PluginB.dll\"));\n        plugin->start();\n        qDebug() << \"PluginB start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to start PluginB\" << e.what();\n    }\n\n    return app.exec();\n}\n"
  },
  {
    "path": "ServiceFactory/CTK.pri",
    "content": "# CTK 安装路径\nCTK_INSTALL_PATH = $$PWD/../../CTKInstall\n\n# CTK 插件相关库所在路径（例如：CTKCore.lib、CTKPluginFramework.lib）\nCTK_LIB_PATH = $$CTK_INSTALL_PATH/lib/ctk-0.1\n\n# CTK 插件相关头文件所在路径（例如：ctkPluginFramework.h）\nCTK_INCLUDE_PATH = $$CTK_INSTALL_PATH/include/ctk-0.1\n\n# CTK 插件相关头文件所在路径（主要因为用到了 service 相关东西）\nCTK_INCLUDE_FRAMEWORK_PATH = $$PWD/../../CTK-master/Libs/PluginFramework\n\nLIBS += -L$$CTK_LIB_PATH -lCTKCore -lCTKPluginFramework\n\nINCLUDEPATH += $$CTK_INCLUDE_PATH \\\n               $$CTK_INCLUDE_FRAMEWORK_PATH\n"
  },
  {
    "path": "ServiceFactory/Plugins/Hello/Hello.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = Hello\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    hello_service.h \\\n    hello_impl.h \\\n    hello_activator.h \\\n    service_factory.h\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "ServiceFactory/Plugins/Hello/MANIFEST.MF",
    "content": "﻿Plugin-SymbolicName: Hello\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for say hello\nPlugin-Name: Hello\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0\n"
  },
  {
    "path": "ServiceFactory/Plugins/Hello/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/Hello/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "ServiceFactory/Plugins/Hello/hello_activator.h",
    "content": "﻿#ifndef HELLO_ACTIVATOR_H\n#define HELLO_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n#include <ctkPluginContext.h>\n#include \"hello_service.h\"\n#include \"service_factory.h\"\n\nclass HelloActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"HELLO\")\n\npublic:\n    // 注册服务工厂\n    void start(ctkPluginContext* context) {\n        ServiceFactory *factory = new ServiceFactory();\n        context->registerService<HelloService>(factory);\n    }\n\n    void stop(ctkPluginContext* context) {\n        Q_UNUSED(context)\n    }\n};\n\n#endif // HELLO_ACTIVATOR_H\n"
  },
  {
    "path": "ServiceFactory/Plugins/Hello/hello_impl.h",
    "content": "﻿#ifndef HELLO_IMPL_H\n#define HELLO_IMPL_H\n\n#include \"hello_service.h\"\n#include <QObject>\n#include <QtDebug>\n\n// HelloWorld\nclass HelloWorldImpl : public QObject, public HelloService\n{\n    Q_OBJECT\n    Q_INTERFACES(HelloService)\n\npublic:\n    void sayHello() Q_DECL_OVERRIDE {\n        qDebug() << \"Hello,World!\";\n    }\n};\n\n// HelloCTK\nclass HelloCTKImpl : public QObject, public HelloService\n{\n    Q_OBJECT\n    Q_INTERFACES(HelloService)\n\npublic:\n    void sayHello() Q_DECL_OVERRIDE {\n        qDebug() << \"Hello,CTK!\";\n    }\n};\n\n#endif // HELLO_IMPL_H\n"
  },
  {
    "path": "ServiceFactory/Plugins/Hello/hello_service.h",
    "content": "﻿#ifndef HELLO_SERVICE_H\n#define HELLO_SERVICE_H\n\n#include <QtPlugin>\n\nclass HelloService\n{\npublic:\n    virtual ~HelloService() {}\n    virtual void sayHello() = 0;\n};\n\n#define HelloService_iid \"org.commontk.service.demos.HelloService\"\nQ_DECLARE_INTERFACE(HelloService, HelloService_iid)\n\n#endif // HELLO_SERVICE_H\n"
  },
  {
    "path": "ServiceFactory/Plugins/Hello/service_factory.h",
    "content": "﻿#ifndef SERVICE_FACTORY_H\n#define SERVICE_FACTORY_H\n\n#include <ctkServiceFactory.h>\n#include <ctkPluginConstants.h>\n#include <ctkVersion.h>\n#include \"hello_impl.h\"\n\nclass ServiceFactory : public QObject, public ctkServiceFactory\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkServiceFactory)\n\npublic:\n    ServiceFactory() : m_counter(0) {}\n\n    // 创建服务对象\n    QObject* getService(QSharedPointer<ctkPlugin> plugin, ctkServiceRegistration registration) Q_DECL_OVERRIDE {\n        Q_UNUSED(registration)\n\n        qDebug() << \"Create object of HelloService for: \" << plugin->getSymbolicName();\n        m_counter++;\n        qDebug() << \"Number of plugins using service: \" << m_counter;\n\n        QHash<QString, QString> headers = plugin->getHeaders();\n        ctkVersion version = ctkVersion::parseVersion(headers.value(ctkPluginConstants::PLUGIN_VERSION));\n        QString name = headers.value(ctkPluginConstants::PLUGIN_NAME);\n\n        QObject* hello = getHello(version);\n        return hello;\n    }\n\n    // 释放服务对象\n    void ungetService(QSharedPointer<ctkPlugin> plugin, ctkServiceRegistration registration, QObject* service) Q_DECL_OVERRIDE {\n        Q_UNUSED(plugin)\n        Q_UNUSED(registration)\n        Q_UNUSED(service)\n\n        qDebug() << \"Release object of HelloService for: \"  << plugin->getSymbolicName();\n        m_counter--;\n        qDebug() << \"Number of plugins using service: \"  << m_counter;\n    }\n\nprivate:\n    // 根据不同的版本，获取不同的服务\n    QObject* getHello(ctkVersion version) {\n        if (version.toString().contains(\"alpha\")) {\n            return new HelloWorldImpl();\n        } else {\n            return new HelloCTKImpl();\n        }\n    }\n\nprivate:\n    int m_counter;  // 计数器\n};\n\n#endif // SERVICE_FACTORY_H\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginA/MANIFEST.MF",
    "content": "﻿Plugin-SymbolicName: Plugin.A\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for test\nPlugin-Name: PluginA\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0.alpha\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginA/PluginA.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = PluginA\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    plugin_a_service.h \\\n    plugin_a_impl.h \\\n    plugin_a_activator.h\n\nSOURCES += \\\n    plugin_a_activator.cpp \\\n    plugin_a_impl.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginA/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/PluginA/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginA/plugin_a_activator.cpp",
    "content": "#include \"plugin_a_impl.h\"\n#include \"plugin_a_activator.h\"\n#include \"../Hello/hello_service.h\"\n#include <ctkPluginContext.h>\n#include <QtDebug>\n\nvoid PluginAActivator::start(ctkPluginContext* context)\n{\n    m_pPlugin = new PluginAImpl();\n    context->registerService<PluginAService>(m_pPlugin);\n\n    // 第一次访问服务\n    ctkServiceReference reference = context->getServiceReference<HelloService>();\n    if (reference) {\n        HelloService* service = qobject_cast<HelloService *>(context->getService(reference));\n        if (service != Q_NULLPTR) {\n            service->sayHello();\n        }\n\n        qDebug() << \"The first call: \" << service;\n    }\n\n    // 第二次访问服务\n    reference = context->getServiceReference<HelloService>();\n    if (reference) {\n        HelloService* service = qobject_cast<HelloService *>(context->getService(reference));\n        if (service != Q_NULLPTR) {\n            service->sayHello();\n        }\n\n        qDebug() << \"The second call: \" << service;\n    }\n}\n\nvoid PluginAActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pPlugin;\n    m_pPlugin = Q_NULLPTR;\n}\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginA/plugin_a_activator.h",
    "content": "﻿#ifndef PLUGIN_A_ACTIVATOR_H\n#define PLUGIN_A_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass PluginAImpl;\n\nclass PluginAActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"PLUGIN_A\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    PluginAImpl *m_pPlugin;\n};\n\n#endif // PLUGIN_A_ACTIVATOR_H\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginA/plugin_a_impl.cpp",
    "content": "﻿#include \"plugin_a_impl.h\"\n#include <QtDebug>\n\nPluginAImpl::PluginAImpl()\n{\n\n}\n\nvoid PluginAImpl::doSomething()\n{\n    qDebug() << \"Do something...A\";\n}\n\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginA/plugin_a_impl.h",
    "content": "﻿#ifndef PLUGIN_A_IMPL_H\n#define PLUGIN_A_IMPL_H\n\n#include \"plugin_a_service.h\"\n#include <QObject>\n\nclass PluginAImpl : public QObject, public PluginAService\n{\n    Q_OBJECT\n    Q_INTERFACES(PluginAService)\n\npublic:\n    PluginAImpl();\n    void doSomething() Q_DECL_OVERRIDE;\n};\n\n#endif // PLUGIN_A_IMPL_H\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginA/plugin_a_service.h",
    "content": "﻿#ifndef PLUGIN_A_SERVICE_H\n#define PLUGIN_A_SERVICE_H\n\n#include <QtPlugin>\n\nclass PluginAService\n{\npublic:\n    virtual ~PluginAService() {}\n    virtual void doSomething() = 0;\n};\n\n#define PluginAService_iid \"org.commontk.service.demos.PluginAService\"\nQ_DECLARE_INTERFACE(PluginAService, PluginAService_iid)\n\n#endif // PLUGIN_A_SERVICE_H\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginB/MANIFEST.MF",
    "content": "﻿Plugin-SymbolicName: Plugin.B\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for test\nPlugin-Name: PluginB\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0.beta\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginB/PluginB.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = PluginB\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    plugin_b_service.h \\\n    plugin_b_impl.h \\\n    plugin_b_activator.h\n\nSOURCES += \\\n    plugin_b_impl.cpp \\\n    plugin_b_activator.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginB/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/PluginB/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginB/plugin_b_activator.cpp",
    "content": "﻿#include \"plugin_b_impl.h\"\n#include \"plugin_b_activator.h\"\n#include \"../Hello/hello_service.h\"\n#include <ctkPluginContext.h>\n\nvoid PluginBActivator::start(ctkPluginContext* context)\n{\n    m_pPlugin = new PluginBImpl();\n    context->registerService<PluginBService>(m_pPlugin);\n\n    // 访问服务\n    ctkServiceReference reference = context->getServiceReference<HelloService>();\n    if (reference) {\n        HelloService* service = qobject_cast<HelloService *>(context->getService(reference));\n        if (service != Q_NULLPTR) {\n            service->sayHello();\n        }\n    }\n}\n\nvoid PluginBActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pPlugin;\n    m_pPlugin = Q_NULLPTR;\n}\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginB/plugin_b_activator.h",
    "content": "﻿#ifndef PLUGIN_B_ACTIVATOR_H\n#define PLUGIN_B_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass PluginBImpl;\n\nclass PluginBActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"PLUGIN_B\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    PluginBImpl *m_pPlugin;\n};\n\n#endif // PLUGIN_B_ACTIVATOR_H\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginB/plugin_b_impl.cpp",
    "content": "﻿#include \"plugin_b_impl.h\"\n#include <QtDebug>\n\nPluginBImpl::PluginBImpl()\n{\n\n}\n\nvoid PluginBImpl::doSomething()\n{\n    qDebug() << \"Do something...B\";\n}\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginB/plugin_b_impl.h",
    "content": "﻿#ifndef PLUGIN_B_IMPL_H\n#define PLUGIN_B_IMPL_H\n\n#include \"plugin_b_service.h\"\n#include <QObject>\n\nclass PluginBImpl : public QObject, public PluginBService\n{\n    Q_OBJECT\n    Q_INTERFACES(PluginBService)\n\npublic:\n    PluginBImpl();\n    void doSomething() Q_DECL_OVERRIDE;\n};\n\n#endif // PLUGIN_B_IMPL_H\n"
  },
  {
    "path": "ServiceFactory/Plugins/PluginB/plugin_b_service.h",
    "content": "﻿#ifndef PLUGIN_B_SERVICE_H\n#define PLUGIN_B_SERVICE_H\n\n#include <QtPlugin>\n\nclass PluginBService\n{\npublic:\n    virtual ~PluginBService() {}\n    virtual void doSomething() = 0;\n};\n\n#define PluginBService_iid \"org.commontk.service.demos.PluginBService\"\nQ_DECLARE_INTERFACE(PluginBService, PluginBService_iid)\n\n#endif // PLUGIN_B_SERVICE_H\n"
  },
  {
    "path": "ServiceFactory/Plugins/Plugins.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    Hello \\\n    PluginA \\\n    PluginB\n\nCONFIG += ordered\n"
  },
  {
    "path": "ServiceFactory/ServiceFactory.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    App \\\n    Plugins\n\nCONFIG += ordered\n"
  },
  {
    "path": "ServiceFactory/ServiceFactory.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.13.0, 2021-03-10T12:34:18. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{c4da1889-17ad-47a8-bddc-cd90da2180db}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.2\">\n    <value type=\"QString\" key=\"language\">Nim</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">NimGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">3</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">2</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"QString\" key=\"EditorConfiguration.ignoreFileTypes\">*.md, *.MD, Makefile</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.skipTrailingWhitespace\">true</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.ActiveFrameworks\">\n    <value type=\"bool\" key=\"AutoTest.Framework.Boost\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.Catch\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.GTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtQuickTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtTest\">true</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.CheckStates\"/>\n   <value type=\"int\" key=\"AutoTest.RunAfterBuild\">0</value>\n   <value type=\"bool\" key=\"AutoTest.UseGlobal\">true</value>\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">4</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"DeviceType\">Desktop</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5151.win64_msvc2019_64_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">1</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-ServiceFactory-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-ServiceFactory-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-ServiceFactory-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-ServiceFactory-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-ServiceFactory-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-ServiceFactory-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"CustomOutputParsers\"/>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/ctk/CTK-examples/ServiceFactory/App/App.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/d/mmm/qt/ctk/CTK-examples/ServiceFactory/App/App.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/d/mmm/qt/ctk/CTK-examples/build-ServiceFactory-Desktop_Qt_5_15_1_MSVC2019_64bit-Release/App/../bin</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "ServiceTracker/App/App.pro",
    "content": "QT += core\nQT -= gui\n\nTARGET = ServiceTracker\nCONFIG += console\nTEMPLATE = app\nDESTDIR = $$OUT_PWD/../bin\n\ninclude($$PWD/../CTK.pri)\n\nSOURCES += main.cpp\n"
  },
  {
    "path": "ServiceTracker/App/main.cpp",
    "content": "﻿// main.cpp\n#include <QCoreApplication>\n#include <QDirIterator>\n#include <QtDebug>\n\n#include <ctkPluginFrameworkFactory.h>\n#include <ctkPluginFramework.h>\n#include <ctkPluginException.h>\n#include <ctkPluginContext.h>\n\n#include \"../Plugins/Login/login_service.h\"\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication app(argc, argv);\n\n    ctkPluginFrameworkFactory frameWorkFactory;\n    QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();\n    try {\n        // 初始化并启动插件框架\n        framework->init();\n        framework->start();\n        qDebug() << \"CTK Plugin Framework start ...\";\n    } catch (const ctkPluginException &e) {\n        qDebug() << \"Failed to initialize the plugin framework: \" << e.what();\n        return -1;\n    }\n\n    // 获取插件上下文\n    ctkPluginContext* context = framework->getPluginContext();\n\n    // 获取插件所在位置\n    QString path = QCoreApplication::applicationDirPath() + \"/plugins\";\n\n    // 遍历路径下的所有插件\n    QDirIterator itPlugin(path, QStringList() << \"*.dll\" << \"*.so\", QDir::Files);\n    while (itPlugin.hasNext()) {\n        QString strPlugin = itPlugin.next();\n        try {\n            // 安装插件\n            QSharedPointer<ctkPlugin> plugin = context->installPlugin(QUrl::fromLocalFile(strPlugin));\n            // 启动插件\n            plugin->start(ctkPlugin::START_TRANSIENT);\n            qDebug() << \"Plugin start ...\";\n        } catch (const ctkPluginException &e) {\n            qDebug() << \"Failed to install plugin\" << e.what();\n            return -1;\n        }\n    }\n\n    // 获取服务引用\n    ctkServiceReference reference = context->getServiceReference<LoginService>();\n    if (reference) {\n        // 获取指定 ctkServiceReference 引用的服务对象\n        LoginService* service = qobject_cast<LoginService *>(context->getService(reference));\n        if (service != Q_NULLPTR) {\n            // 调用服务\n            service->login(\"root\", \"123456\");\n        }\n    }\n\n    return app.exec();\n}\n"
  },
  {
    "path": "ServiceTracker/CTK.pri",
    "content": "# CTK 安装路径\nCTK_INSTALL_PATH = $$PWD/../../CTKInstall\n\n# CTK 插件相关库所在路径（例如：CTKCore.lib、CTKPluginFramework.lib）\nCTK_LIB_PATH = $$CTK_INSTALL_PATH/lib/ctk-0.1\n\n# CTK 插件相关头文件所在路径（例如：ctkPluginFramework.h）\nCTK_INCLUDE_PATH = $$CTK_INSTALL_PATH/include/ctk-0.1\n\n# CTK 插件相关头文件所在路径（主要因为用到了 service 相关东西）\nCTK_INCLUDE_FRAMEWORK_PATH = $$PWD/../../CTK-master/Libs/PluginFramework\n\nLIBS += -L$$CTK_LIB_PATH -lCTKCore -lCTKPluginFramework\n\nINCLUDEPATH += $$CTK_INCLUDE_PATH \\\n               $$CTK_INCLUDE_FRAMEWORK_PATH\n"
  },
  {
    "path": "ServiceTracker/Plugins/Log/Log.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = Log\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    log_service.h \\\n    log_impl.h \\\n    log_activator.h\n\nSOURCES += \\\n    log_activator.cpp \\\n    log_impl.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "ServiceTracker/Plugins/Log/MANIFEST.MF",
    "content": "﻿Plugin-SymbolicName: Log\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for log\nPlugin-Name: Log\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0\n"
  },
  {
    "path": "ServiceTracker/Plugins/Log/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/Log/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "ServiceTracker/Plugins/Log/log_activator.cpp",
    "content": "﻿#include \"log_impl.h\"\n#include \"log_activator.h\"\n#include <ctkPluginContext.h>\n#include <QtDebug>\n\nvoid LogActivator::start(ctkPluginContext* context)\n{\n    m_pPlugin = new LogImpl();\n    context->registerService<LogService>(m_pPlugin);\n}\n\nvoid LogActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    delete m_pPlugin;\n    m_pPlugin = Q_NULLPTR;\n}\n"
  },
  {
    "path": "ServiceTracker/Plugins/Log/log_activator.h",
    "content": "﻿#ifndef LOG_ACTIVATOR_H\n#define LOG_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass LogImpl;\n\nclass LogActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"LOG\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    LogImpl *m_pPlugin;\n};\n\n#endif // LOG_ACTIVATOR_H\n"
  },
  {
    "path": "ServiceTracker/Plugins/Log/log_impl.cpp",
    "content": "﻿#include \"log_impl.h\"\n#include <QtDebug>\n\nLogImpl::LogImpl()\n{\n\n}\n\nvoid LogImpl::debug(QString msg)\n{\n    qDebug() << \"This is a debug message: \" << msg;\n}\n\n"
  },
  {
    "path": "ServiceTracker/Plugins/Log/log_impl.h",
    "content": "﻿#ifndef LOG_IMPL_H\n#define LOG_IMPL_H\n\n#include \"log_service.h\"\n#include <QObject>\n\nclass LogImpl : public QObject, public LogService\n{\n    Q_OBJECT\n    Q_INTERFACES(LogService)\n\npublic:\n    LogImpl();\n    void debug(QString msg) Q_DECL_OVERRIDE;\n};\n\n#endif // LOG_IMPL_H\n"
  },
  {
    "path": "ServiceTracker/Plugins/Log/log_service.h",
    "content": "﻿#ifndef LOG_SERVICE_H\n#define LOG_SERVICE_H\n\n#include <QtPlugin>\n\nclass LogService\n{\npublic:\n    virtual ~LogService() {}\n    virtual void debug(QString msg) = 0;\n};\n\n#define LogService_iid \"org.commontk.service.demos.LogService\"\nQ_DECLARE_INTERFACE(LogService, LogService_iid)\n\n#endif // LOG_SERVICE_H\n"
  },
  {
    "path": "ServiceTracker/Plugins/Login/Login.pro",
    "content": "QT += core\nQT -= gui\n\nTEMPLATE = lib\nCONFIG += plugin\nTARGET = Login\nDESTDIR = $$OUT_PWD/../../bin/plugins\n\ninclude($$PWD/../../CTK.pri)\n\nHEADERS += \\\n    login_service.h \\\n    login_impl.h \\\n    login_activator.h \\\n    service_tracker.h\n\nSOURCES += \\\n    login_impl.cpp \\\n    login_activator.cpp\n\nRESOURCES += Resource.qrc\n"
  },
  {
    "path": "ServiceTracker/Plugins/Login/MANIFEST.MF",
    "content": "﻿Plugin-SymbolicName: Login\nPlugin-ActivationPolicy: eager\nPlugin-Category: Demos\nPlugin-ContactAddress: https://github.com/myhhub\nPlugin-Description: A plugin for login\nPlugin-Name: Login\nPlugin-Vendor: myh\nPlugin-Version: 1.0.0\n"
  },
  {
    "path": "ServiceTracker/Plugins/Login/Resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/Login/META-INF\">\n        <file>MANIFEST.MF</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "ServiceTracker/Plugins/Login/login_activator.cpp",
    "content": "﻿#include \"login_impl.h\"\n#include \"login_activator.h\"\n#include \"service_tracker.h\"\n#include <ctkPluginContext.h>\n\nvoid LoginActivator::start(ctkPluginContext* context)\n{\n    // 开启服务跟踪器\n    m_pTracker = new ServiceTracker(context);\n    m_pTracker->open();\n\n    m_pPlugin = new LoginImpl(m_pTracker);\n    m_registration = context->registerService<LoginService>(m_pPlugin);\n}\n\nvoid LoginActivator::stop(ctkPluginContext* context)\n{\n    Q_UNUSED(context)\n\n    // 注销服务\n    m_registration.unregister();\n\n    // 关闭服务跟踪器\n    m_pTracker->close();\n\n    delete m_pPlugin;\n    m_pPlugin = Q_NULLPTR;\n}\n"
  },
  {
    "path": "ServiceTracker/Plugins/Login/login_activator.h",
    "content": "﻿#ifndef LOGIN_ACTIVATOR_H\n#define LOGIN_ACTIVATOR_H\n\n#include <ctkPluginActivator.h>\n\nclass LoginImpl;\nclass ServiceTracker;\n\nclass LoginActivator : public QObject, public ctkPluginActivator\n{\n    Q_OBJECT\n    Q_INTERFACES(ctkPluginActivator)\n    Q_PLUGIN_METADATA(IID \"LOGIN\")\n\npublic:\n    void start(ctkPluginContext* context);\n    void stop(ctkPluginContext* context);\n\nprivate:\n    LoginImpl *m_pPlugin;\n    ServiceTracker* m_pTracker;\n    ctkServiceRegistration m_registration;\n};\n\n#endif // LOGIN_ACTIVATOR_H\n"
  },
  {
    "path": "ServiceTracker/Plugins/Login/login_impl.cpp",
    "content": "﻿#include \"login_impl.h\"\n#include \"service_tracker.h\"\n\nLoginImpl::LoginImpl(ServiceTracker *tracker)\n    : m_pTracker(tracker)\n{\n\n}\n\nbool LoginImpl::login(const QString& username, const QString& password)\n{ \n    LogService* service = (LogService*)(m_pTracker->getService());\n\n    if (QString::compare(username, \"root\") == 0 && QString::compare(password, \"123456\") == 0) {\n        if (service != Q_NULLPTR)\n            service->debug(\"Login successfully\");\n        return true;\n    } else {\n        if (service != Q_NULLPTR)\n            service->debug(\"Login failed\");\n        return false;\n    }\n}\n"
  },
  {
    "path": "ServiceTracker/Plugins/Login/login_impl.h",
    "content": "﻿#ifndef LOGIN_IMPL_H\n#define LOGIN_IMPL_H\n\n#include \"login_service.h\"\n#include <QObject>\n\nclass ServiceTracker;\n\nclass LoginImpl : public QObject, public LoginService\n{\n    Q_OBJECT\n    Q_INTERFACES(LoginService)\n\npublic:\n    LoginImpl(ServiceTracker *tracker);\n    bool login(const QString& username, const QString& password) Q_DECL_OVERRIDE;\n\nprivate:\n    ServiceTracker *m_pTracker;\n};\n\n#endif // LOGIN_IMPL_H\n"
  },
  {
    "path": "ServiceTracker/Plugins/Login/login_service.h",
    "content": "﻿#ifndef LOGIN_SERVICE_H\n#define LOGIN_SERVICE_H\n\n#include <QtPlugin>\n\nclass LoginService\n{\npublic:\n    virtual ~LoginService() {}\n    virtual bool login(const QString& username, const QString& password) = 0;\n};\n\n#define LoginService_iid \"org.commontk.service.demos.LoginService\"\nQ_DECLARE_INTERFACE(LoginService, LoginService_iid)\n\n#endif // LOGIN_SERVICE_H\n"
  },
  {
    "path": "ServiceTracker/Plugins/Login/service_tracker.h",
    "content": "﻿#ifndef SERVICE_TRACKER_H\n#define SERVICE_TRACKER_H\n\n#include <ctkPluginContext.h>\n#include <ctkServiceTracker.h>\n#include \"../Log/log_service.h\"\n\nclass ServiceTracker : public ctkServiceTracker<LogService *>\n{\npublic:\n    ServiceTracker(ctkPluginContext* context) : ctkServiceTracker<LogService *>(context) {}\n    ~ServiceTracker() {}\n\nprotected:\n    // 在 Service 注册时访问\n    LogService* addingService(const ctkServiceReference& reference) Q_DECL_OVERRIDE {\n        qDebug() << \"Adding service:\" << reference.getPlugin()->getSymbolicName();\n        // return ctkServiceTracker::addingService(reference);\n\n        LogService* service = (LogService*)(ctkServiceTracker::addingService(reference));\n        if (service != Q_NULLPTR) {\n            service->debug(\"Ok\");\n        }\n\n        return service;\n    }\n\n    void modifiedService(const ctkServiceReference& reference, LogService* service) Q_DECL_OVERRIDE {\n        qDebug() << \"Modified service:\" << reference.getPlugin()->getSymbolicName();\n        ctkServiceTracker::modifiedService(reference, service);\n    }\n\n    void removedService(const ctkServiceReference& reference, LogService* service) Q_DECL_OVERRIDE {\n        qDebug() << \"Removed service:\" << reference.getPlugin()->getSymbolicName();\n        ctkServiceTracker::removedService(reference, service);\n    }\n};\n\n#endif // SERVICE_TRACKER_H\n"
  },
  {
    "path": "ServiceTracker/Plugins/Plugins.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    Login \\\n    Log\n\nCONFIG += ordered\n"
  },
  {
    "path": "ServiceTracker/ServiceTracker.pro",
    "content": "TEMPLATE = subdirs\n\nSUBDIRS += \\\n    App \\\n    Plugins\n\nCONFIG += ordered\n"
  },
  {
    "path": "ServiceTracker/ServiceTracker.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.13.0, 2021-03-09T14:06:11. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{c4da1889-17ad-47a8-bddc-cd90da2180db}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.2\">\n    <value type=\"QString\" key=\"language\">Nim</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">NimGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">3</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">2</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"QString\" key=\"EditorConfiguration.ignoreFileTypes\">*.md, *.MD, Makefile</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.skipTrailingWhitespace\">true</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.ActiveFrameworks\">\n    <value type=\"bool\" key=\"AutoTest.Framework.Boost\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.Catch\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.GTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtQuickTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtTest\">true</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.CheckStates\"/>\n   <value type=\"int\" key=\"AutoTest.RunAfterBuild\">0</value>\n   <value type=\"bool\" key=\"AutoTest.UseGlobal\">true</value>\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">4</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"DeviceType\">Desktop</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5151.win64_msvc2019_64_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">1</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-ServiceTracker-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-ServiceTracker-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-ServiceTracker-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-ServiceTracker-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-ServiceTracker-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-ServiceTracker-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"CustomOutputParsers\"/>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/ctk/CTK-examples/ServiceTracker/App/App.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/d/mmm/qt/ctk/CTK-examples/ServiceTracker/App/App.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/d/mmm/qt/ctk/CTK-examples/build-ServiceTracker-Desktop_Qt_5_15_1_MSVC2019_64bit-Release/App/../bin</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "UseCTKWidgets/UseCTKWidgets.pro",
    "content": "QT += core gui widgets\n\nTARGET = UseCTKWidgets\nTEMPLATE = app\n\n# CTK 安装路径\nCTK_INSTALL_PATH = $$PWD/../../CTKInstall\n\n# CTK 相关库所在路径（例如：CTKCore.lib、CTKWidgets.lib）\nCTK_LIB_PATH = $$CTK_INSTALL_PATH/lib/ctk-0.1\n\n# CTK 相关头文件所在路径（例如：ctkPluginFramework.h）\nCTK_INCLUDE_PATH = $$CTK_INSTALL_PATH/include/ctk-0.1\n\n# 相关库文件（CTKCore.lib、CTKWidgets.lib）\nLIBS += -L$$CTK_LIB_PATH -lCTKCore -lCTKWidgets\n\nINCLUDEPATH += $$CTK_INCLUDE_PATH\n\nSOURCES += main.cpp\n"
  },
  {
    "path": "UseCTKWidgets/UseCTKWidgets.pro.user",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE QtCreatorProject>\n<!-- Written by QtCreator 4.13.0, 2021-03-09T16:44:11. -->\n<qtcreator>\n <data>\n  <variable>EnvironmentId</variable>\n  <value type=\"QByteArray\">{c4da1889-17ad-47a8-bddc-cd90da2180db}</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.ActiveTarget</variable>\n  <value type=\"int\">0</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.EditorSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"bool\" key=\"EditorConfiguration.AutoIndent\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.AutoSpacesForTabs\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.CamelCaseNavigation\">true</value>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.0\">\n    <value type=\"QString\" key=\"language\">Cpp</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">CppGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.1\">\n    <value type=\"QString\" key=\"language\">QmlJS</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">QmlJSGlobal</value>\n    </valuemap>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"EditorConfiguration.CodeStyle.2\">\n    <value type=\"QString\" key=\"language\">Nim</value>\n    <valuemap type=\"QVariantMap\" key=\"value\">\n     <value type=\"QByteArray\" key=\"CurrentPreferences\">NimGlobal</value>\n    </valuemap>\n   </valuemap>\n   <value type=\"int\" key=\"EditorConfiguration.CodeStyle.Count\">3</value>\n   <value type=\"QByteArray\" key=\"EditorConfiguration.Codec\">UTF-8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ConstrainTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.IndentSize\">4</value>\n   <value type=\"bool\" key=\"EditorConfiguration.KeyboardTooltips\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.MarginColumn\">80</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseHiding\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.MouseNavigation\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.PaddingMode\">1</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ScrollWheelZooming\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.ShowMargin\">false</value>\n   <value type=\"int\" key=\"EditorConfiguration.SmartBackspaceBehavior\">0</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SmartSelectionChanging\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.SpacesForTabs\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabKeyBehavior\">0</value>\n   <value type=\"int\" key=\"EditorConfiguration.TabSize\">8</value>\n   <value type=\"bool\" key=\"EditorConfiguration.UseGlobal\">true</value>\n   <value type=\"int\" key=\"EditorConfiguration.Utf8BomBehavior\">2</value>\n   <value type=\"bool\" key=\"EditorConfiguration.addFinalNewLine\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanIndentation\">true</value>\n   <value type=\"bool\" key=\"EditorConfiguration.cleanWhitespace\">true</value>\n   <value type=\"QString\" key=\"EditorConfiguration.ignoreFileTypes\">*.md, *.MD, Makefile</value>\n   <value type=\"bool\" key=\"EditorConfiguration.inEntireDocument\">false</value>\n   <value type=\"bool\" key=\"EditorConfiguration.skipTrailingWhitespace\">true</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.PluginSettings</variable>\n  <valuemap type=\"QVariantMap\">\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.ActiveFrameworks\">\n    <value type=\"bool\" key=\"AutoTest.Framework.Boost\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.Catch\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.GTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtQuickTest\">true</value>\n    <value type=\"bool\" key=\"AutoTest.Framework.QtTest\">true</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"AutoTest.CheckStates\"/>\n   <value type=\"int\" key=\"AutoTest.RunAfterBuild\">0</value>\n   <value type=\"bool\" key=\"AutoTest.UseGlobal\">true</value>\n   <valuelist type=\"QVariantList\" key=\"ClangCodeModel.CustomCommandLineKey\">\n    <value type=\"QString\">-fno-delayed-template-parsing</value>\n   </valuelist>\n   <value type=\"bool\" key=\"ClangCodeModel.UseGlobalConfig\">true</value>\n   <value type=\"QString\" key=\"ClangCodeModel.WarningConfigId\">Builtin.Questionable</value>\n   <valuemap type=\"QVariantMap\" key=\"ClangTools\">\n    <value type=\"bool\" key=\"ClangTools.BuildBeforeAnalysis\">true</value>\n    <value type=\"QString\" key=\"ClangTools.DiagnosticConfig\">Builtin.DefaultTidyAndClazy</value>\n    <value type=\"int\" key=\"ClangTools.ParallelJobs\">4</value>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedDirs\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SelectedFiles\"/>\n    <valuelist type=\"QVariantList\" key=\"ClangTools.SuppressedDiagnostics\"/>\n    <value type=\"bool\" key=\"ClangTools.UseGlobalSettings\">true</value>\n   </valuemap>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Target.0</variable>\n  <valuemap type=\"QVariantMap\">\n   <value type=\"QString\" key=\"DeviceType\">Desktop</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop Qt 5.15.1 MSVC2019 64bit</value>\n   <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">qt.qt5.5151.win64_msvc2019_64_kit</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">1</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>\n   <value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">0</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.0\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-UseCTKWidgets-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-UseCTKWidgets-Desktop_Qt_5_15_1_MSVC2019_64bit-Debug</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Debug</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">2</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">2</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.1\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">2</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-UseCTKWidgets-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-UseCTKWidgets-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Release</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">2</value>\n   </valuemap>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.2\">\n    <value type=\"bool\">true</value>\n    <value type=\"int\" key=\"EnableQmlDebugging\">0</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">C:\\d\\mmm\\qt\\ctk\\CTK-examples\\build-UseCTKWidgets-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir\">C:/d/mmm/qt/ctk/CTK-examples/build-UseCTKWidgets-Desktop_Qt_5_15_1_MSVC2019_64bit-Profile</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">QtProjectManager.QMakeBuildStep</value>\n      <value type=\"QString\" key=\"QtProjectManager.QMakeBuildStep.QMakeArguments\"></value>\n      <value type=\"bool\" key=\"QtProjectManager.QMakeBuildStep.QMakeForced\">false</value>\n      <valuelist type=\"QVariantList\" key=\"QtProjectManager.QMakeBuildStep.SelectedAbis\"/>\n     </valuemap>\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.1\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">false</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\"></value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">2</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Build</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>\n    </valuemap>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">\n     <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">\n      <value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>\n      <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.MakeStep</value>\n      <valuelist type=\"QVariantList\" key=\"Qt4ProjectManager.MakeStep.BuildTargets\"/>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.Clean\">true</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeArguments\">clean</value>\n      <value type=\"QString\" key=\"Qt4ProjectManager.MakeStep.MakeCommand\"></value>\n      <value type=\"bool\" key=\"Qt4ProjectManager.MakeStep.OverrideMakeflags\">false</value>\n     </valuemap>\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Clean</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>\n    <value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.CustomParsers\"/>\n    <valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Profile</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4BuildConfiguration</value>\n    <value type=\"int\" key=\"Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration\">0</value>\n    <value type=\"int\" key=\"QtQuickCompiler\">0</value>\n    <value type=\"int\" key=\"SeparateDebugInfo\">0</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">3</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">\n     <value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Deploy</value>\n     <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>\n    </valuemap>\n    <value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>\n    <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.DeployConfiguration.CustomData\"/>\n    <value type=\"bool\" key=\"ProjectExplorer.DeployConfiguration.CustomDataEnabled\">false</value>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.DefaultDeployConfiguration</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.PluginSettings\"/>\n   <valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.0\">\n    <value type=\"QString\" key=\"Analyzer.Perf.CallgraphMode\">dwarf</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.Events\">\n     <value type=\"QString\">cpu-cycles</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.ExtraArguments\"/>\n    <value type=\"int\" key=\"Analyzer.Perf.Frequency\">250</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Perf.RecordArguments\">\n     <value type=\"QString\">-e</value>\n     <value type=\"QString\">cpu-cycles</value>\n     <value type=\"QString\">--call-graph</value>\n     <value type=\"QString\">dwarf,4096</value>\n     <value type=\"QString\">-F</value>\n     <value type=\"QString\">250</value>\n    </valuelist>\n    <value type=\"QString\" key=\"Analyzer.Perf.SampleMode\">-F</value>\n    <value type=\"bool\" key=\"Analyzer.Perf.Settings.UseGlobalSettings\">true</value>\n    <value type=\"int\" key=\"Analyzer.Perf.StackSize\">4096</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.AggregateTraces\">false</value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.FlushEnabled\">false</value>\n    <value type=\"uint\" key=\"Analyzer.QmlProfiler.FlushInterval\">1000</value>\n    <value type=\"QString\" key=\"Analyzer.QmlProfiler.LastTraceFile\"></value>\n    <value type=\"bool\" key=\"Analyzer.QmlProfiler.Settings.UseGlobalSettings\">true</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.AddedSuppressionFiles\"/>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectBusEvents\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.CollectSystime\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableBranchSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableCacheSim\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Callgrind.EnableEventToolTips\">true</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.MinimumCostRatio\">0.01</value>\n    <value type=\"double\" key=\"Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio\">10</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.FilterExternalIssues\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.KCachegrindExecutable\">kcachegrind</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.LeakCheckOnFinish\">1</value>\n    <value type=\"int\" key=\"Analyzer.Valgrind.NumCallers\">25</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.RemovedSuppressionFiles\"/>\n    <value type=\"int\" key=\"Analyzer.Valgrind.SelfModifyingCodeDetection\">1</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.Settings.UseGlobalSettings\">true</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.ShowReachable\">false</value>\n    <value type=\"bool\" key=\"Analyzer.Valgrind.TrackOrigins\">true</value>\n    <value type=\"QString\" key=\"Analyzer.Valgrind.ValgrindExecutable\">valgrind</value>\n    <valuelist type=\"QVariantList\" key=\"Analyzer.Valgrind.VisibleErrorKinds\">\n     <value type=\"int\">0</value>\n     <value type=\"int\">1</value>\n     <value type=\"int\">2</value>\n     <value type=\"int\">3</value>\n     <value type=\"int\">4</value>\n     <value type=\"int\">5</value>\n     <value type=\"int\">6</value>\n     <value type=\"int\">7</value>\n     <value type=\"int\">8</value>\n     <value type=\"int\">9</value>\n     <value type=\"int\">10</value>\n     <value type=\"int\">11</value>\n     <value type=\"int\">12</value>\n     <value type=\"int\">13</value>\n     <value type=\"int\">14</value>\n    </valuelist>\n    <valuelist type=\"QVariantList\" key=\"CustomOutputParsers\"/>\n    <value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>\n    <valuelist type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>\n    <value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qt4ProjectManager.Qt4RunConfiguration:C:/d/mmm/qt/ctk/CTK-examples/UseCTKWidgets/UseCTKWidgets.pro</value>\n    <value type=\"QString\" key=\"ProjectExplorer.RunConfiguration.BuildKey\">C:/d/mmm/qt/ctk/CTK-examples/UseCTKWidgets/UseCTKWidgets.pro</value>\n    <value type=\"QString\" key=\"RunConfiguration.Arguments\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.Arguments.multi\">false</value>\n    <value type=\"QString\" key=\"RunConfiguration.OverrideDebuggerStartup\"></value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseCppDebuggerAuto\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseLibrarySearchPath\">true</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseMultiProcess\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebugger\">false</value>\n    <value type=\"bool\" key=\"RunConfiguration.UseQmlDebuggerAuto\">true</value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory\"></value>\n    <value type=\"QString\" key=\"RunConfiguration.WorkingDirectory.default\">C:/d/mmm/qt/ctk/CTK-examples/build-UseCTKWidgets-Desktop_Qt_5_15_1_MSVC2019_64bit-Release</value>\n   </valuemap>\n   <value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">1</value>\n  </valuemap>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.TargetCount</variable>\n  <value type=\"int\">1</value>\n </data>\n <data>\n  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>\n  <value type=\"int\">22</value>\n </data>\n <data>\n  <variable>Version</variable>\n  <value type=\"int\">22</value>\n </data>\n</qtcreator>\n"
  },
  {
    "path": "UseCTKWidgets/main.cpp",
    "content": "﻿#include <QApplication>\n#include <QFormLayout>\n#include <QVBoxLayout>\n\n#include <ctkCheckablePushButton.h>\n#include <ctkCollapsibleButton.h>\n#include <ctkColorPickerButton.h>\n#include <ctkRangeWidget.h>\n\nint main(int argc, char* argv[])\n{\n  QApplication app(argc, argv);\n\n  // 可折叠按钮\n  ctkCollapsibleButton* buttons = new ctkCollapsibleButton(\"Buttons\");\n\n  // 可勾选按钮\n  ctkCheckablePushButton* checkablePushButton = new ctkCheckablePushButton();\n  checkablePushButton->setText(\"Checkable\");\n\n  // 颜色拾取器\n  ctkColorPickerButton* colorPickerButton = new ctkColorPickerButton();\n  colorPickerButton->setColor(QColor(\"#9e1414\"));\n\n  ctkCollapsibleButton* sliders = new ctkCollapsibleButton(\"Sliders\");\n\n  QFormLayout* buttonsLayout = new QFormLayout;\n  buttonsLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);\n  buttonsLayout->addRow(\"ctkCheckablePushButton\", checkablePushButton);\n  buttonsLayout->addRow(\"ctkColorPickerButton\", colorPickerButton);\n  buttons->setLayout(buttonsLayout);\n\n  QVBoxLayout* topLevelLayout = new QVBoxLayout();\n  topLevelLayout->addWidget(buttons);\n  topLevelLayout->addWidget(sliders);\n\n  QFormLayout* slidersLayout = new QFormLayout;\n  ctkRangeWidget* rangeWidget = new ctkRangeWidget();\n  slidersLayout->addRow(\"ctkRangeWidget\", rangeWidget);\n  sliders->setLayout(slidersLayout);\n\n  QWidget topLevel;\n  topLevel.setLayout(topLevelLayout);\n  topLevel.show();\n\n  return app.exec();\n}\n"
  }
]