3DSlicer18:Layouts
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                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的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 水滴石穿C语言之extern声明辨析
- 下一篇: 一个DirectSound的例子
