1.主要的类

  • vtkMRMLLayoutNode: 描述视图布局的节点,一个场景只存在一个布局节点。
  • vtkMRMLLayoutLogic: 控制/观测图层节点,如果需要会自动创建视图节点(在布局节点描述中引用,而不是场景中引用)。
  • vtkMRMLAbstractViewNode: 所有视图节点的抽象类(例如vtkMRMLSliceNode, vtkMRMLViewNode, vtkMRMLChartViewNode) 。
  • ctkLayoutManager: 将布局描述(XML)转换成Qt布局的机制。
  • qMRMLLayoutManager:ctkLayoutManager 的专用版本,只处理MRML的视图与属性。
  • qSlicerLayoutManager: qMRMLLayoutManager 的专用版本,处理Slicer的特定行为。Slicer图层管理器可以通过qSlicerApplication访问。

2.如何注册一个新的布局layout?

qMRMLLayoutSliceViewFactory* mrmlSliceViewFactory =qobject_cast<qMRMLLayoutSliceViewFactory*>(d->app->layoutManager()->mrmlViewFactory("vtkMRMLSliceNode"));qSlicerCustomLayoutSliceViewFactory* customSliceViewFactory =new qSlicerCustomLayoutSliceViewFactory(d->app->layoutManager());customSliceViewFactory->setSliceLogics(mrmlSliceViewFactory->sliceLogics());d->app->layoutManager()->unregisterViewFactory(mrmlSliceViewFactory);d->app->layoutManager()->registerViewFactory(customSliceViewFactory);

3.View XML(Layout description) elements

vtkMRMLLayoutNode* layoutNode =  vtkMRMLLayoutNode::SafeDownCast(this->mrmlScene()->GetSingletonNode("vtkMRMLLayoutNode","vtkMRMLLayoutNode"));
std::string layoutDescription = layoutNode->GetLayoutDescription(index);

采用SetLayoutDescription方法可以修改布局描述XML。

4.示例:自定义布局 qSlicerCustomLayoutSlicerViewFactory

#ifndef __qSlicerAstroVolumeLayoutSliceViewFactory_h
#define __qSlicerAstroVolumeLayoutSliceViewFactory_h// SlicerQt includes
#include "qMRMLLayoutManager.h"
#include "qMRMLLayoutManager_p.h"// VTK includes
#include <vtkWeakPointer.h>
#include "qSlicerAstroVolumeModuleExport.h"///class qSlicerAstroVolumeLayoutSliceViewFactoryPrivate;/// \ingroup Slicer_QtModules_AstroVolume
class Q_SLICER_QTMODULES_ASTROVOLUME_EXPORT qSlicerAstroVolumeLayoutSliceViewFactory: public qMRMLLayoutSliceViewFactory
{Q_OBJECT
public:typedef qMRMLLayoutSliceViewFactory Superclass;qSlicerAstroVolumeLayoutSliceViewFactory(QObject* parent);virtual ~qSlicerAstroVolumeLayoutSliceViewFactory();virtual QString viewClassName()const;protected:virtual QWidget* createViewFromNode(vtkMRMLAbstractViewNode* viewNode);virtual void deleteView(vtkMRMLAbstractViewNode* viewNode);private:Q_DECLARE_PRIVATE(qSlicerAstroVolumeLayoutSliceViewFactory);Q_DISABLE_COPY(qSlicerAstroVolumeLayoutSliceViewFactory);
};#endif
//-----------------------------------------------------------------------------
qSlicerAstroVolumeLayoutSliceViewFactory::qSlicerAstroVolumeLayoutSliceViewFactory(QObject* _parent): Superclass(_parent)
{
}//-----------------------------------------------------------------------------
qSlicerAstroVolumeLayoutSliceViewFactory::~qSlicerAstroVolumeLayoutSliceViewFactory()
{
}
//-----------------------------------------------------------------------------
QWidget* qSlicerAstroVolumeLayoutSliceViewFactory::createViewFromNode(vtkMRMLAbstractViewNode* viewNode)
{if (!this->layoutManager() || !viewNode){// can't create a slice widget if there is no parent widgetQ_ASSERT(viewNode);return 0;}// there is a unique slice widget per nodeQ_ASSERT(!this->viewWidget(viewNode));qMRMLSliceAstroWidget * sliceWidget = new qMRMLSliceAstroWidget(this->layoutManager()->viewport());sliceWidget->sliceController()->setControllerButtonGroup(this->SliceControllerButtonGroup);QString sliceLayoutName(viewNode->GetLayoutName());QString sliceViewLabel(viewNode->GetLayoutLabel());vtkMRMLSliceNode* sliceNode = vtkMRMLSliceNode::SafeDownCast(viewNode);QColor sliceLayoutColor = QColor::fromRgbF(sliceNode->GetLayoutColor()[0],sliceNode->GetLayoutColor()[1],sliceNode->GetLayoutColor()[2]);sliceWidget->setSliceViewName(sliceLayoutName);sliceWidget->setObjectName(QString("qMRMLSliceWidget" + sliceLayoutName));sliceWidget->setSliceViewLabel(sliceViewLabel);sliceWidget->setSliceViewColor(sliceLayoutColor);sliceWidget->setMRMLScene(this->mrmlScene());sliceWidget->setMRMLSliceNode(sliceNode);sliceWidget->setSliceLogics(this->sliceLogics());this->sliceLogics()->AddItem(sliceWidget->sliceLogic());return sliceWidget;
}void qSlicerAstroVolumeLayoutSliceViewFactory::deleteView(vtkMRMLAbstractViewNode *viewNode)
{qMRMLSliceAstroWidget* sliceWidget =qobject_cast<qMRMLSliceAstroWidget*>(this->viewWidget(viewNode));if (sliceWidget){this->sliceLogics()->RemoveItem(sliceWidget->sliceLogic());}this->Superclass::deleteView(viewNode);
}QString qSlicerAstroVolumeLayoutSliceViewFactory::viewClassName() const
{return "vtkMRMLSliceNode";
}

3DSlicer18:Layouts相关推荐

  1. Android用户界面布局(layouts)

    Android用户界面布局(layouts) 备注:view理解为视图 一个布局定义了用户界面的可视结构,比如activity的UI或是APP widget的UI,我们可以用下面两种方式来声明布局: ...

  2. React开发(145):目录规范:

    ``` config ├── config.js         umi 配置目录 ├── plugin.config.js  webpack插件配置目录 └── router.config.js   ...

  3. 闲云旅游项目开发-(第一篇:使用Element-ui实现主页轮播图)

    业务需求: 初始化布局 页头页脚公共组件 首页轮播图 一 初始化默认全局布局 nuxtjs 提供了一个公共组件 layouts/default.vue,相当于以前的 app.vue .该布局组件默认作 ...

  4. log4j:log4j2配置文件解析

    本文主要对如下配置文件进行解析: status=info name=PropertiesConfigrootLogger.level=info rootLogger.appenderRef.stdou ...

  5. PyQt5桌面应用开发(4):界面设计

    本文目录 PyQt5桌面应用系列 前言 为什么又是需求分析? PyQt5的界面设计元素 界面设计元素分类 编译为Python代码使用 转换命令行 组合使用 继承使用方式 直接使用ui文件的方法 总结 ...

  6. 模板引擎--handlebars

    handlebar简介 Handlebar是javascript的引擎模板,通过对view和data的分离来快速的构建web模板.使用handlebar模块可以在加载时被预编译,而不是等客户端执行到某 ...

  7. 前端动画优化及性能检测

    前端动画优化及性能检测工具使用 前端使用动画可以分为两类: css 动画 js 动画 我们提倡能够使用 css 完成的动画尽量使用 css ( 即使用 animation 和 keyframes ). ...

  8. Handlebars partials 隐藏的力量

    一个项目的机会再加上我自己的探索,让我对Handlebars partials有了更深的理解.事实证明,你可以做得比我了解的更多. 我最近在负责一个小项目,只有很少的静态页面.因为太小了,我们最开始没 ...

  9. 利用 GitHub 搭建独立 Web 网站

    Hugo 是一款快速搭建网站的主题框架,相对于 Hexo 来说, Hugo 的主题以及性能更加出色,并且类型上更加多元化,下面我们试着用 Hugo 来搭建网站.详情可以去 Hugo官网 查看. Hug ...

最新文章

  1. R语言应用实战系列(三)-智能推荐模型的构建
  2. Visual Studio 智能提示消失解决办法
  3. node截图服务可用性报告
  4. atom对比 vscode_VS Code、ATOM这些开源文本编辑器的代码实现中有哪些奇技淫巧?...
  5. 如何利用php下载文件_PHP使用文件流下载文件方法
  6. python a or b 输出值为_深入分析python的and or 返回值
  7. ql的python学习之路-day3
  8. 循环数组的动态规划问题
  9. python编程语言一览_编程语言大汇总(Part Ⅰ)
  10. duilib开发(六):基本控件介绍
  11. 坚持写博客对我们有什么好处
  12. OpenWrt network 启动过程
  13. Python比较文本相似度的7种方法(详细)
  14. 瑞萨 RA2E1 触摸按键使用例程
  15. OpenStack------Placement组件部署
  16. 为什么上传速度比下载速度慢
  17. ECNU-2018计算机学院考研机试
  18. SQL中NVL和NVL2有什么区别,以及NULLIF 的使用
  19. Opencv4(C++)实战案例1:将朦胧的图像变清晰(去雾)
  20. 三、HDMI与I2C

热门文章

  1. springboot Serving Web Content with Spring MVC
  2. OSChina 周三乱弹 ——相亲妹子说了一句让我肾疼的话
  3. Android中Dialog与DialogFragment的对比
  4. 无法绑定由多个部分组成的标识符“System.Data.DataRowView”
  5. 巧用组策略技术禁用办公室QQ聊天
  6. poj-2101Honey and Milk Land
  7. matPlotLib绘制决策树
  8. C语言 指针在函数传参中的使用
  9. 《javascript面向对象编程指南》读书笔记
  10. Django 部署(Nginx+uwsgi)