CTK基础
Common Toolkit:支持生物医学图像计算的公共开发包。
参考:
http://www.commontk.org/
https://github.com/commontk
CTK模块
在设计之初 CTK 针对医学成像和建模领域,包含的内容很多,Plugin Framework、Widgets、DICOM......可以选择对自己有用的模块,当前CTK的主要范围主题包括:
(1) DICOM
包含Qt小部件,可以轻松地建立服务器连接,并发送查询和查看结果。DCMTK用作底层工具包。
(2) Widgets
用于生物医学成像应用的Qt Widgets控件集合库。
(3)Plugin Framework
CTK Plugin Framework 同时借鉴了 OSGi 和 Qt Creator 的思想。
作为 CTK 的核心,CTK Plugin Framework 实现了几乎完整的 OSGi 框架 API,所以只要有模块化需求,完全可以在任何 C++ 项目中使用 CTK。
CTK插件框架可以简单地描述为c++的动态组件系统。它直接基于OSGi Release 4 4.2版,其中一些API是受即将发布的4.3版的启发而设计的。像OSGi这样的行业标准为CTK插件框架带来了稳定的API和规范的好处。
CTK 插件相关的 API 非常简单,核心 API 不到 25 个类。这个核心 API 足以编写插件、安装、启动、停止、更新和卸载它们,并且还包含了所有的监听类。
(4)Command Line Interfaces
一种允许以自包含的可执行文件形式编写的算法在多个最终用户应用程序环境中使用而无需修改的技术。
CTK插件
参考: CTK完整教程(OSGI for C++ 实现 C++ Qt 模块化)
CTK插件的设计通常涉及到以下关键部分:接口定义、服务实现和插件激活器。
- ctk框架核心:框架和插件------框架加载插件,框架和插件之间的通讯使用事件或者信号槽。
- 框架的核心:框架和需要调用的服务类。
- 插件的核心:实现类和激活类。
实例代码:
eg. 插件框架主函数:
cpp
#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();
}