• 怎样在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)

    四、典型应用

    Crop Volume module  依存于  Volumes module

  • 相关阅读:
    avalon background-image写法
    eslint 规则
    性能优化 && 用户体验
    gif
    react 生命周期
    git reset
    js 正则表达式
    大小写问题
    python中的负数取模问题(一个大坑)
    python中的__init_subclass__是什么?
  • 原文地址:https://www.cnblogs.com/oneDongHua/p/14264101.html
Copyright © 2020-2023  润新知