CTK的安装和使用

 基于visual studio配置和使用CTK。

01

CTK简明介绍

CTK(Common Toolkit)是一个用于医疗成像应用的开源软件工具包,建立在Qt基础之上。它提供了一些扩展和功能,使其在某些场景中优于普通的Qt插件系统。以下是CTK插件系统相对于普通Qt插件的一些优势:

1. 专为医疗应用设计

CTK特别针对医疗成像和临床应用进行了优化。它包含了一些医疗领域特定的功能和组件,这些在普通的Qt插件系统中并没有现成的支持。

2. 动态加载和卸载插件

CTK插件系统支持动态加载和卸载插件。这意味着可以在应用程序运行时添加或移除功能,而无需重新启动应用程序。这对于需要在运行时进行扩展或更新的医疗应用程序特别有用。

3. 插件依赖管理

CTK提供了一个插件框架,可以管理插件之间的依赖关系。它能够确保所有依赖的插件正确加载,从而避免因缺少依赖而导致的错误。

4. 丰富的元数据支持

CTK插件系统允许插件包含丰富的元数据(如描述、版本、依赖关系等),这些元数据可以用于更好地管理和展示插件信息。

5. 扩展和模块化设计

CTK采用模块化设计,使得各个功能组件可以独立开发和维护。模块化设计还允许更容易地扩展系统功能,添加新模块不会影响现有模块的稳定性。

6. 社区支持和文档

CTK有一个活跃的社区,并且有详细的文档和示例代码。这对于开发者来说是一个重要的资源,可以帮助他们快速上手和解决遇到的问题。

7. 兼容性

CTK与Qt紧密集成,并且能够与其他一些流行的开源医疗成像工具(如VTK、ITK)配合使用,形成一个强大的医疗应用开发平台。这种兼容性和集成能力是普通的Qt插件系统所不具备的。

02

资源

(1)CTK官方源码(一直有人在维护)。

c818f2e97d010084f2a4a7782e28e673.png

源码链接:https://github.com/commontk/CTK

(2)CTK的源码编译。

1c2099ace6e7b40e8abd21b95c07991b.png

编译得到如下文件夹。


ed954701036106638703f08b47b09c44.png

具体指引详见:https://blog.csdn.net/jizhidexiaoming/article/details/133132649

(3)详细中文教程

48bc5d0e75e751cfea525f7891ca8889.png

此教程是基于qt creator,做了很多ctk使用教程。

具体指引详见:

https://github.com/myhhub/CTK-project

本文是基于visual studio 2019,并加上自己的一些知识整理。

03

visual studio 2019配置CTK

(1)环境变量配置dll路径

fb76382acd465c70af11b517ab96215c.png

(2)包含目录

0c38457afc4f448fb4605b73c9756188.png

(3)lib库目录

375378304beeda24cecf771a5ab33379.png

04

visual studio 2019使用CTK

(1)使用CTK自带的gui功能

比如button, slider, layout之类,如下使用ctk接口搭建的简单界面。

e648884b79e7d3c6fd203f96aa1819ac.png

#include <QApplication>
#include <QFormLayout>
#include <QVBoxLayout>


#include <ctkCheckablePushButton.h>
#include <ctkCollapsibleButton.h>
#include <ctkColorPickerButton.h>
#include <ctkRangeWidget.h>


int main(int argc, char* argv[])
{
    QApplication app(argc, argv);


    // 可折叠按钮
    ctkCollapsibleButton* buttons = new ctkCollapsibleButton("Buttons");


    // 可勾选按钮
    ctkCheckablePushButton* checkablePushButton = new ctkCheckablePushButton();
    checkablePushButton->setText("Checkable");


    // 颜色拾取器
    ctkColorPickerButton* colorPickerButton = new ctkColorPickerButton();
    colorPickerButton->setColor(QColor("#9e1414"));


    ctkCollapsibleButton* sliders = new ctkCollapsibleButton("Sliders");


    QFormLayout* buttonsLayout = new QFormLayout;
    buttonsLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
    buttonsLayout->addRow("ctkCheckablePushButton", checkablePushButton);
    buttonsLayout->addRow("ctkColorPickerButton", colorPickerButton);
    buttons->setLayout(buttonsLayout);


    QVBoxLayout* topLevelLayout = new QVBoxLayout();
    topLevelLayout->addWidget(buttons);
    topLevelLayout->addWidget(sliders);


    QFormLayout* slidersLayout = new QFormLayout;
    ctkRangeWidget* rangeWidget = new ctkRangeWidget();
    slidersLayout->addRow("ctkRangeWidget", rangeWidget);
    sliders->setLayout(slidersLayout);


    QWidget topLevel;
    topLevel.setLayout(topLevelLayout);
    topLevel.show();


    return app.exec();
}

(2)极其简单的打包和调用示例

使用CTK,主要是因为其强大的管理dll能力。

新建Qt Console Application,此为APP调用示例项目。

44ae7d6ba73c2d94bb26386eaaf60b52.png

新建Qt class Library,此为HelloCTK dll。

22f9227644bb528107eb7be580045cad.png

a2c62f562b692c8c85a6e359e676696e.png

新建这两个项目后,按照前面的03节配置环境。

注意:要打包成ctk类型的dll,只需要继承ctkPluginActivator并实现其接口start和stop。

一般是定义一个激活器,比如HelloActivator,继承ctkPluginActivator。如下。

69e7676646eee63e50ada1e724c05f7b.png

hello_activator.h

#ifndef HELLO_ACTIVATOR_H
#define HELLO_ACTIVATOR_H


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


class HelloActivator : public QObject, public ctkPluginActivator
{
    Q_OBJECT


    Q_INTERFACES(ctkPluginActivator)
    Q_PLUGIN_METADATA(IID "HELLO_CTK")
    /*Qt 元对象系统 HelloActivator 实现了 ctkPluginActivator 接口。*/


public:
    void start(ctkPluginContext* context);
    void stop(ctkPluginContext* context);


};


#endif // HELLO_ACTIVATOR_H

hello_activator.cpp

#include "hello_activator.h"
#include <QDebug>


void HelloActivator::start(ctkPluginContext* context)
{
    qDebug() << "HelloCTK start";
}


void HelloActivator::stop(ctkPluginContext* context)
{
    qDebug() << "HelloCTK stop";
    Q_UNUSED(context)
}

其次,在使用CTK(Common Toolkit)进行插件开发时,MANIFEST.MF 文件的配置是必须的。MANIFEST.MF 文件是一个标准的Java JAR文件清单文件格式,但在CTK和OSGi(Open Service Gateway initiative)环境中也使用类似的清单文件来定义插件的元数据和配置。

15c41855ec3f3c7bbb1c63585035740d.png

MANIFEST.MF内容如下。Plugin-SymbolicName是插件名,也是项目名。

Plugin-SymbolicName:HelloCTK

Plugin-Version:1.0.0

Plugin-Number:100

MANIFEST.MF的作用:

  • 插件框架需要依赖MANIFEST.MF文件中的信息来识别和管理插件。没有这个文件,插件框架将无法知道插件的唯一标识符、版本、入口点等关键信息。

  • 依赖关系是插件系统的核心部分。MANIFEST.MF文件中声明的依赖关系帮助插件框架在加载插件之前确保所有必要的依赖项都已被加载。

再添加一个资源管理文件resource.qrc,管理MANIFEST.MF文件。添加此文件方法:右击Resource Files-》添加-》新建项-》Visual C++->Qt-》Qt Resource File。

3b5af695e2965c7f9cfbfeeb08ccac21.png

设置文件前缀/HelloCTK/META-INF,并添加并管理文件MANIFEST.MF。

5fac377a994abb5c4d3c2e8d95ee43fc.png

右击HelloCTK项目,点击生成此dll,如下。

2b7d3d65f740af14c1dcb6e07fa3af0d.png

调用示例程序是APP项目,里面只有一个main函数。

77e7ab36145dc875935223bb4011b060.png

main文件内容如下。

#include <QCoreApplication>
#include "ctkPluginFrameworkFactory.h"
#include "ctkPluginFramework.h"
#include "ctkPluginException.h"
#include "ctkPlugin.h"
#include "ctkPluginContext.h"


#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    app.setApplicationName("SampleCTK");
    ctkPluginFrameworkFactory frameWorkFactory;
    QSharedPointer<ctkPluginFramework> framework = frameWorkFactory.getFramework();
    try {
        framework->init();
        framework->start();
        qDebug() << "CTK Plugin Framework start ...";


        QString dir = QCoreApplication::applicationDirPath();
        dir += "/plugins/HelloCTK.dll";
        qDebug() << dir;
        QUrl url = QUrl::fromLocalFile(dir);
        QSharedPointer<ctkPlugin> plugin;
        try
        {
            plugin = framework->getPluginContext()->installPlugin(url);
        }catch(ctkPluginException e){
            qDebug() << e.message() << e.getType();
        }
        try{
            plugin->start(ctkPlugin::START_TRANSIENT);
        }catch(ctkPluginException e){
            qDebug() << e.message() << e.getType();
        }


    } catch (const ctkPluginException &e) {
        qDebug() << "Failed to initialize the plugin framework: " << e.what();
        qDebug() << e.message() << e.getType();
    }
    return app.exec();
}

运行结果如下。

5f9dde603d3accc7f360eb712aaf88d8.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值