怎样在3Dslicer中创建LoadableModule
一、初始化
1.创建LoadableModule的文件目录
利用slicer中的 extension wizard模块来产生基于模板的文件和目录。
2.编译创建(build)
3.装载(install)
4.检查模块情况(check)
5.用启动器打开QtDesigner
6.在QtDesigner中修改界面文件.ui
7.根据应用需要编辑相应的文件.cpp/.h
二、在QtDesigner中设置widget的图标
1.Qt中的资源管理系统
在Qt工程的工程文件中可以包含Qt资源管理文件.qrc 。例如在Qt的界面中可能会用到的图片,其调用方式就有两种,一是放在可执行程序外部,采用绝对或相对路径的方式调用,这种方式当图片位置发生变化,那么程序将无法正常显示图片;另外一种就是使用Qt的资源系统来存储图片,这样他们就可以嵌入到可执行程序中去了。最好(图像资源等资源文件都包含在一个文件夹中,如./Icons)。相应的在在工程文件*.pro中须添加行:
RESOURCES +=\myImage.qrc
对于Qt资源管理文件.qrc,在工程的目录下须建立一个资源管理文件夹如./Icons,在该文件夹中放入资源文件如image.png等(Qt的资源系统要求资源文件必须放在qrc文件的同级或子级目录下)。其实资源可以是任意类型的,不只是图片文件,不过资源只能是只读的,不能对其进行更改。编译时会对加入的资源自动压缩。
.qrc文件实际上是一个XML格式的文件,在其中须添加如下内容(典型的*.qrc文件):
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>Icons/image.png</file>
</qresource>
</RCC>
在项目的cpp文件中引用资源时:
QIcon(":/Icons/image.png") //调用Icons文件夹中的image.png。
2.怎样为Qt部件添加图标
需要在部件的图标属性入口处(部件的属性管理器)选择资源文件:
- Slicer4/Modules/Loadable/MY_MODULE_NAME/Resources/qSlicerMY_MODULE_NAMEModule.qrc
- Slicer4/Libs/MRML/Widgets/Resources/qMRMLWidget.qrc
- Slicer4/Base/QTGUI/Resources/qSlicerBaseQTGUI.qrc
3.为资源系统添加资源文件
首先在/Icons目录下(Slicer4/Modules/Loadable/MY_MODULE_NAME/Resources/Icon)加入资源文件如pic.png。然后需要在
资源管理文件.qrc中加入如下代码:
<file>Icons/MyIcon.png</file>
三、3Dslicer中模块之间的相互依存关系
在有些情况下你自己开发的loadablemodule需要用到其他模块的信息,如一个模块的logic或者是一些定制的MRML类,这种情况下不需要重复编写模块功能,可采用如下方式,下面的代码给出要设计一个模块依存于Volume模块的logic应该怎样做:
1.修改CMakeLists.txt
set(MODULE_INCLUDE_DIRECTORIES
${CMAKE_CURRENT_SOURCE_DIR}/Widgets
${CMAKE_CURRENT_BINARY_DIR}/Widgets
${vtkSlicerVolumesModuleLogic_SOURCE_DIR} #添加
${vtkSlicerVolumesModuleLogic_BINARY_DIR} #添加
)
...
set(MODULE_TARGET_LIBRARIES
...
vtkSlicerVolumesModuleLogic #添加
)
2.在qSlicerMY_MODULE_NAMEModule.cxx中修改
//-----------------------------------------------------------------------------
QStringList qSlicerMY_MODULE_NAMEModule::dependencies()const
{
return QStringList() << "Volumes";
}
//-----------------------------------------------------------------------------
void qSlicerMY_MODULE_NAMEModule::setup()
{
this->Superclass::setup();
vtkSlicerMY_MODULE_NAMELogic* moduleLogic =
vtkSlicerMY_MODULE_NAMELogic::SafeDownCast(this->logic());
qSlicerAbstractCoreModule* volumesModule =
qSlicerCoreApplication::application()->moduleManager()->module("Volumes");
if (volumesModule)
{
vtkSlicerVolumesLogic* volumesLogic =
vtkSlicerVolumesLogic::SafeDownCast(volumesModule->logic());
moduleLogic->SetVolumesLogic(volumesLogic);
}
在指定了模块的依存关系后,确保了被依存模块会在该模块之前进行setup()。
在CMakeLists.txt中采用类似的操作添加对一个模块部件(widget)的依存:
set(MODULE_INCLUDE_DIRECTORIES
...
${qSlicerVolumesModuleWidgets_SOURCE_DIR}
${qSlicerVolumesModuleWidgets_BINARY_DIR}
...
)
...
set(MODULE_TARGET_LIBRARIES
...
qSlicerVolumesModuleWidgets
)
如果想要获取一个custom MRML或者displayable manager 类,采用相同的工作模式:
- custom MRML (vtkSlicerDEPENDENT_MODULEModuleMRML_SOURCE_DIR)
- displayable manager (vtkSlicerDEPENDENT_MODULEModuleDisplayableManager_SOURCE_DIR)
四、典型应用