GUI Creation
Auto-generating widgets
It is possible to auto-generate GUIs for parameter node wrappers, parameter packs, and their underlying types. The GUI creation will take into account the validators used when choosing which type of widget to generate for a type.
Usage is simple:
from typing import Annotated
from slicer.parameterNodeWrapper import (
createGui,
parameterNodeWrapper,
parameterPack,
)
@parameterPack
class Point:
x: float
y: float
@parameterNodeWrapper
class ParameterNodeWrapper:
point: Point
reduction: Annotated[float, WithinRange(0, 1)]
text: str
parameterNodeWidget = createGui(ParameterNodeWrapper)
The createGui
methods takes a (possibly annotated) type as input and returns an appropriate widget.
Warning
createGui
is intended to work with the GUI connection, so it won’t call things like setMinimum/setMaximum
on the created widgets, as it expects <parameterNodeWrapper>.connectGui
to do that.
Created widget types
Type | Annotations | Widget type |
---|---|---|
int, float, str, bool | Choice | QComboBox |
int | QSpinBox | |
float | Minimum and Maximum, or WithinRange |
ctkSliderWidget |
float | QDoubleSpinBox | |
bool | QCheckBox | |
str | QLineEdit | |
enum.Enum | QComboBox | |
pathlib.[Path, PosixPath, WindowsPath, PurePath, PurePosixPath, PureWindowsPath] |
ctkPathLineEdit | |
vtkMRMLNode (including subclasses and a typing.Union of nodes) |
qMRMLComboBox | |
parameterPack | qSlicerWidget* that is a QFormLayout with the name and appropriate GUI for each parameter in the pack | |
parameterNodeWrapper | qSlicerWidget* that is a ctkCollapsibleButton with a QFormLayout with the name and appropriate GUI for each parameter in the wrapper |
* These are qSlicerWidget
s so they have a setMRMLScene
method. The generated GUI will automatically connect the top level setMRMLScene
to any children that have a setMRMLScene
method (e.g. qMRMLComboBox
).
Tip
You can use the Label
annotation to give a nicer user facing label to a parameter in a parameterPack
or parameterNodeWrapper
.
from typing import Annotated
from slicer import vtkMRMLScalarVolumeNode
from slicer.parameterNodeWrapper import (
createGui,
parameterNodeWrapper,
Label,
)
@parameterNodeWrapper
class ParameterNodeWrapper:
inputVolume: Annotated[vtkMRMLScalarVolumeNode, Label("Input Volume")]
widget = createGui(ParameterNodeWrapper)
# the label is now "Input Volume" instead of "inputVolume".