欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

3DSlicer18:Layouts

发布时间:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 3DSlicer18:Layouts 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1.主要的类

  • vtkMRMLLayoutNode: 描述视图布局的节点,一个场景只存在一个布局节点。
  • vtkMRMLLayoutLogic: 控制/观测图层节点,如果需要会自动创建视图节点(在布局节点描述中引用,而不是场景中引用)。
  • vtkMRMLAbstractViewNode: 所有视图节点的抽象类(例如vtkMRMLSliceNode, vtkMRMLViewNode, vtkMRMLChartViewNode) 。
  • ctkLayoutManager: 将布局描述(XML)转换成Qt布局的机制。
  • qMRMLLayoutManager:ctkLayoutManager 的专用版本,只处理MRML的视图与属性。
  • qSlicerLayoutManagerqMRMLLayoutManager 的专用版本,处理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的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。