3DSlicer18:Layouts
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相关推荐
- Android用户界面布局(layouts)
Android用户界面布局(layouts) 备注:view理解为视图 一个布局定义了用户界面的可视结构,比如activity的UI或是APP widget的UI,我们可以用下面两种方式来声明布局: ...
- React开发(145):目录规范:
``` config ├── config.js umi 配置目录 ├── plugin.config.js webpack插件配置目录 └── router.config.js ...
- 闲云旅游项目开发-(第一篇:使用Element-ui实现主页轮播图)
业务需求: 初始化布局 页头页脚公共组件 首页轮播图 一 初始化默认全局布局 nuxtjs 提供了一个公共组件 layouts/default.vue,相当于以前的 app.vue .该布局组件默认作 ...
- log4j:log4j2配置文件解析
本文主要对如下配置文件进行解析: status=info name=PropertiesConfigrootLogger.level=info rootLogger.appenderRef.stdou ...
- PyQt5桌面应用开发(4):界面设计
本文目录 PyQt5桌面应用系列 前言 为什么又是需求分析? PyQt5的界面设计元素 界面设计元素分类 编译为Python代码使用 转换命令行 组合使用 继承使用方式 直接使用ui文件的方法 总结 ...
- 模板引擎--handlebars
handlebar简介 Handlebar是javascript的引擎模板,通过对view和data的分离来快速的构建web模板.使用handlebar模块可以在加载时被预编译,而不是等客户端执行到某 ...
- 前端动画优化及性能检测
前端动画优化及性能检测工具使用 前端使用动画可以分为两类: css 动画 js 动画 我们提倡能够使用 css 完成的动画尽量使用 css ( 即使用 animation 和 keyframes ). ...
- Handlebars partials 隐藏的力量
一个项目的机会再加上我自己的探索,让我对Handlebars partials有了更深的理解.事实证明,你可以做得比我了解的更多. 我最近在负责一个小项目,只有很少的静态页面.因为太小了,我们最开始没 ...
- 利用 GitHub 搭建独立 Web 网站
Hugo 是一款快速搭建网站的主题框架,相对于 Hexo 来说, Hugo 的主题以及性能更加出色,并且类型上更加多元化,下面我们试着用 Hugo 来搭建网站.详情可以去 Hugo官网 查看. Hug ...
最新文章
- R语言应用实战系列(三)-智能推荐模型的构建
- Visual Studio 智能提示消失解决办法
- node截图服务可用性报告
- atom对比 vscode_VS Code、ATOM这些开源文本编辑器的代码实现中有哪些奇技淫巧?...
- 如何利用php下载文件_PHP使用文件流下载文件方法
- python a or b 输出值为_深入分析python的and or 返回值
- ql的python学习之路-day3
- 循环数组的动态规划问题
- python编程语言一览_编程语言大汇总(Part Ⅰ)
- duilib开发(六):基本控件介绍
- 坚持写博客对我们有什么好处
- OpenWrt network 启动过程
- Python比较文本相似度的7种方法(详细)
- 瑞萨 RA2E1 触摸按键使用例程
- OpenStack------Placement组件部署
- 为什么上传速度比下载速度慢
- ECNU-2018计算机学院考研机试
- SQL中NVL和NVL2有什么区别,以及NULLIF 的使用
- Opencv4(C++)实战案例1:将朦胧的图像变清晰(去雾)
- 三、HDMI与I2C
热门文章
- springboot Serving Web Content with Spring MVC
- OSChina 周三乱弹 ——相亲妹子说了一句让我肾疼的话
- Android中Dialog与DialogFragment的对比
- 无法绑定由多个部分组成的标识符“System.Data.DataRowView”
- 巧用组策略技术禁用办公室QQ聊天
- poj-2101Honey and Milk Land
- matPlotLib绘制决策树
- C语言 指针在函数传参中的使用
- 《javascript面向对象编程指南》读书笔记
- Django 部署(Nginx+uwsgi)