“ 基于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官方源码(一直有人在维护)。

源码链接:https://github.com/commontk/CTK
(2)CTK的源码编译。

编译得到如下文件夹。

具体指引详见:https://blog.csdn.net/jizhidexiaoming/article/details/133132649
(3)详细中文教程

此教程是基于qt creator,做了很多ctk使用教程。
具体指引详见:
https://github.com/myhhub/CTK-project
本文是基于visual studio 2019,并加上自己的一些知识整理。
03
—
visual studio 2019配置CTK
(1)环境变量配置dll路径

(2)包含目录

(3)lib库目录

04
—
visual studio 2019使用CTK
(1)使用CTK自带的gui功能
比如button, slider, layout之类,如下使用ctk接口搭建的简单界面。

#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调用示例项目。

新建Qt class Library,此为HelloCTK dll。


新建这两个项目后,按照前面的03节配置环境。
注意:要打包成ctk类型的dll,只需要继承ctkPluginActivator并实现其接口start和stop。
一般是定义一个激活器,比如HelloActivator,继承ctkPluginActivator。如下。

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)环境中也使用类似的清单文件来定义插件的元数据和配置。

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。

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

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

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

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();
}
运行结果如下。


2926

被折叠的 条评论
为什么被折叠?



