# Add a custom widget to a layout

**URL:** <https://discourse.slicer.org/t/add-a-custom-widget-to-a-layout/24784>\
**Category:** Development\
**Created:** [August 16, 2022, 1:26pm UTC](https://discourse.slicer.org/t/add-a-custom-widget-to-a-layout/24784 "2022-08-16T13:26:52Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![mau\_igna\_06](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/mau_igna_06/32/9056_2.png) [@mau\_igna\_06](https://discourse.slicer.org/u/mau_igna_06)\
**Post date:** [August 16, 2022, 1:26pm UTC](https://discourse.slicer.org/t/add-a-custom-widget-to-a-layout/24784/1 "2022-08-16T13:26:52Z")

</div>

I tried this code to make a custom layout (with a custom widget) for a scripted module and it doesn’t work:

```auto
    #get custom layout widgets
    containingListWidget = slicer.util.loadUI(self.resourcePath('UI/containingListWidget.ui'))
    self.containingListUI = slicer.util.childWidgetVariables(containingListWidget)
    slicer.mrmlScene.AddDefaultNode(containingListWidget)

    # Set scene in MRML widgets. Make sure that in Qt designer the top-level qMRMLWidget's
    # "mrmlSceneChanged(vtkMRMLScene*)" signal in is connected to each MRML widget's.
    # "setMRMLScene(vtkMRMLScene*)" slot.
    containingListWidget.setMRMLScene(slicer.mrmlScene)

    customLayout = """
    <layout type="vertical">
      <item>
      <widget class="listFrame">
      </widget>
      </item>
      <item>
    </layout>
    """

```

It brings up this error:

```auto
slicer.mrmlScene.AddDefaultNode(availableVersionsWidget)
TypeError: AddDefaultNode argument 1: method requires a VTK object

```

Could you help?

---

<div class="post-metadata">

**Author:** ![Sunderlandkyl](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/sunderlandkyl/32/79987_2.png) [@Sunderlandkyl](https://discourse.slicer.org/u/Sunderlandkyl)\
**Post date:** [August 16, 2022, 3:05pm UTC](https://discourse.slicer.org/t/add-a-custom-widget-to-a-layout/24784/2 "2022-08-16T15:05:32Z")

</div>

The error is because loadUI creates a QWiget, not a vtkMRMLNode.

Custom widgets can be added to view layouts using qSlicerSingletonViewFactory:

```python
containingListWidget = slicer.util.loadUI(self.resourcePath('UI/containingListWidget.ui'))
self.containingListUI = slicer.util.childWidgetVariables(containingListWidget)
containingListWidget.setMRMLScene(slicer.mrmlScene)

viewFactory = slicer.qSlicerSingletonViewFactory()
viewFactory.setTagName("listWidget")
viewFactory.setWidget(containingListWidget)
slicer.app.layoutManager().registerViewFactory(viewFactory)

layout = """
<layout type=\"horizontal\">
  <item>
    <listWidget></listWidget>
  </item>
</layout>"""
layoutId = 1234

layoutNode = slicer.app.layoutManager().layoutLogic().GetLayoutNode()
layoutNode.AddLayoutDescription(
  layoutId, layout)

slicer.app.layoutManager().setLayout(layoutId)

```

---

<div class="post-metadata">

**Author:** ![mau\_igna\_06](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/mau_igna_06/32/9056_2.png) [@mau\_igna\_06](https://discourse.slicer.org/u/mau_igna_06)\
**Post date:** [August 16, 2022, 3:07pm UTC](https://discourse.slicer.org/t/add-a-custom-widget-to-a-layout/24784/3 "2022-08-16T15:07:00Z")

</div>

-Thank youas gdfdgfddfhffd
