def __init__(self, scriptedPlugin): AbstractScriptedSubjectHierarchyPlugin.__init__(self, scriptedPlugin) self.exportAsAction = qt.QAction(f"Export as...", scriptedPlugin) self.exportTransformedAsAction = qt.QAction(f"Export transformed as...", scriptedPlugin) self.menu = qt.QMenu("Plugin Menu") self.transformedMenu = qt.QMenu("Transformed Plugin Menu") self.exportAsAction.setMenu(self.menu) self.exportTransformedAsAction.setMenu(self.transformedMenu)
def __init__(self, scriptedPlugin): AbstractScriptedSubjectHierarchyPlugin.__init__(self, scriptedPlugin) pluginHandlerSingleton = slicer.qSlicerSubjectHierarchyPluginHandler.instance() self.subjectHierarchyNode = pluginHandlerSingleton.subjectHierarchyNode() self.exportAsAction = qt.QAction(f"Export as...", scriptedPlugin) self.exportTransformedAsAction = qt.QAction(f"Export transformed as...", scriptedPlugin) self.menu = qt.QMenu("Plugin Menu") self.transformedMenu = qt.QMenu("Transformed Plugin Menu") self.exportAsAction.setMenu(self.menu) self.exportTransformedAsAction.setMenu(self.transformedMenu)
def __init__(self, scriptedPlugin): self.logic = MarkupEditorLogic() self.selectOptions = { "set": "Set selection", "add": "Add to selection", "unset": "Remove from selection" } self.selectViewAction = qt.QAction(f"Pick points with curve...", scriptedPlugin) self.selectViewAction.objectName = 'SelectViewAction' self.selectViewAction.connect("triggered()", self.onSelectViewAction) self.selectMenu = qt.QMenu("Select Menu") self.selectViewAction.setMenu(self.selectMenu) for selectOption in self.selectOptions.keys(): action = self.selectMenu.addAction( self.selectOptions[selectOption]) slot = lambda selectOption=selectOption: self.onSelectViewAction( selectOption) action.connect("triggered()", slot) self.editViewAction = qt.QAction(f"Edit selected points", scriptedPlugin) self.editViewAction.objectName = 'EditViewAction' self.editViewAction.connect("triggered()", self.onEditViewAction) self.deleteViewAction = qt.QAction(f"Delete selected points", scriptedPlugin) self.deleteViewAction.objectName = 'DeleteViewAction' self.deleteViewAction.connect("triggered()", self.onDeleteViewAction) self.reset()
def __init__(self, scriptedPlugin): AbstractScriptedSubjectHierarchyPlugin.__init__(self, scriptedPlugin) pluginHandlerSingleton = slicer.qSlicerSubjectHierarchyPluginHandler.instance() self.subjectHierarchyNode = pluginHandlerSingleton.subjectHierarchyNode() self.formatMarkupsAction = qt.QAction(f"Apply formatting to siblings", scriptedPlugin) self.menu = qt.QMenu("Plugin Menu") self.formatMarkupsAction.setMenu(self.menu)
def __init__(self): qt.QToolButton.__init__(self) ModuleBase.__init__(self) self.setPopupMode(self.InstantPopup) self.setMenu(qt.QMenu(self)) self.action = qt.QWidgetAction(self) self.listWidget = None self.setIcon(Icons.edit) self.enabled = False
def _onMeasurementItemRightClicked(self, point): if not self._measurementsListWidget.currentIndex() or not self._measurementsListWidget.model().rowCount(): return self.listMenu = qt.QMenu() menu_item = self.listMenu.addAction("Remove Item") menu_item.triggered.connect(self._onRemoveFindingRequested) parentPosition = self._measurementsListWidget.mapToGlobal(qt.QPoint(0, 0)) self.listMenu.move(parentPosition + point) self.listMenu.show()
def onRightClick(self): menu = qt.QMenu() position = qt.QCursor.pos() action = qt.QAction("Delete highlighted fiducial(s)", menu) menu.addAction(action) connectObject = qt.QObject() connectObject.connect(action, 'triggered()', self.onDeleteOneFiducialButton) action2 = qt.QAction("Cancel", menu) menu.addAction(action2) connectObject.connect(action2, 'triggered()', menu.hide) menu.exec_(position)
def _addMenu(self, button): menu = qt.QMenu(button) menu.name = button.name button.setMenu(menu) actionGroup = qt.QActionGroup(menu) actionGroup.setExclusive(False) for name, enabled in [(self.LINEAR_MEASUREMENT, True), (self.VOLUMETRIC_MEASUREMENT, False)]: action = qt.QAction(name, actionGroup) action.setEnabled(enabled) menu.addAction(action) actionGroup.addAction(action) action.triggered.connect(lambda triggered, a=action: self._onActionTriggered(a))
def _addMenu(self, button): menu = qt.QMenu(button) menu.name = button.name button.setMenu(menu) actionGroup = qt.QActionGroup(menu) actionGroup.setExclusive(False) for name, enabled in [("Linear Measurement", True), ("Volumetric Measurement", False)]: action = qt.QAction(name, actionGroup) action.setEnabled(enabled) menu.addAction(action) actionGroup.addAction(action) action.triggered.connect( lambda triggered, a=action: self._onActionTriggered(a))
def __init__(self, parent=None): """ Called when the user opens the module the first time and the widget is initialized. """ ScriptedLoadableModuleWidget.__init__(self, parent) VTKObservationMixin.__init__( self) # needed for parameter node observation self.logic = None self._parameterNode = None self._updatingGUIFromParameterNode = False self.currentFiducialNode = None self.currentControlPointID = "-1" # API gets/sets it as a string # Observe JumpToPointEvent of the fiducial display node. self.fiducialDisplayNodeObservation = None # Menus self.tableMenu = qt.QMenu()
def __init__(self): toolTip = '' AbstractToolWidget.__init__(self, 'Draw', toolTip) # set up menu nearestModelAction = qt.QAction('To Nearest Model', self.effectButton) nearestModelAction.setCheckable(True) nearestModelAction.setChecked(True) twoLinesAction = qt.QAction('To Following Line', self.effectButton) twoLinesAction.setCheckable(True) actionsGroup = qt.QActionGroup(self.effectButton) actionsGroup.addAction(nearestModelAction) actionsGroup.addAction(twoLinesAction) menu = qt.QMenu(self.effectButton) menu.addActions(actionsGroup.actions()) self.effectButton.setMenu(menu) self.effectButton.setPopupMode(self.effectButton.DelayedPopup)
def setup(self): ScriptedLoadableModuleWidget.setup(self) # tracks the modified event observer on the currently # selected sequence browser node self.sequenceBrowserObserverRecord = None self.animatorActionsGUI = None self.logic = AnimatorLogic() # Instantiate and connect widgets ... # # Parameters Area # parametersCollapsibleButton = ctk.ctkCollapsibleButton() parametersCollapsibleButton.text = "Animation Parameters" self.layout.addWidget(parametersCollapsibleButton) # Layout within the dummy collapsible button parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton) self.durationBox = ctk.ctkDoubleSpinBox() self.durationBox.suffix = " seconds" self.durationBox.decimals = 1 self.durationBox.minimum = 1 self.durationBox.value = 5 self.durationBox.toolTip = "Duration cannot be changed after animation created" parametersFormLayout.addRow("New animation duration", self.durationBox) # # animation selector # self.animationSelector = slicer.qMRMLNodeComboBox() self.animationSelector.nodeTypes = ["vtkMRMLScriptedModuleNode"] self.animationSelector.setNodeTypeLabel("Animation", "vtkMRMLScriptedModuleNode") self.animationSelector.selectNodeUponCreation = True self.animationSelector.addEnabled = True self.animationSelector.addAttribute("vtkMRMLScriptedModuleNode", "ModuleName", "Animation") self.animationSelector.baseName = "Animation" self.animationSelector.removeEnabled = True self.animationSelector.noneEnabled = True self.animationSelector.showHidden = True self.animationSelector.showChildNodeTypes = False self.animationSelector.setMRMLScene( slicer.mrmlScene ) self.animationSelector.setToolTip( "Pick the animation description." ) parametersFormLayout.addRow("Animation Node: ", self.animationSelector) self.sequencePlay = slicer.qMRMLSequenceBrowserPlayWidget() self.sequencePlay.setMRMLScene(slicer.mrmlScene) self.sequenceSeek = slicer.qMRMLSequenceBrowserSeekWidget() self.sequenceSeek.setMRMLScene(slicer.mrmlScene) parametersFormLayout.addRow(self.sequencePlay) parametersFormLayout.addRow(self.sequenceSeek) self.actionsMenuButton = qt.QPushButton("Add Action") self.actionsMenuButton.enabled = False self.actionsMenu = qt.QMenu() self.actionsMenuButton.setMenu(self.actionsMenu) for actionName in slicer.modules.animatorActionPlugins.keys(): qAction = qt.QAction(actionName, self.actionsMenu) qAction.connect('triggered()', lambda actionName=actionName: self.onAddAction(actionName)) self.actionsMenu.addAction(qAction) parametersFormLayout.addWidget(self.actionsMenuButton) # # Actions Area # self.actionsCollapsibleButton = ctk.ctkCollapsibleButton() self.actionsCollapsibleButton.text = "Actions" self.layout.addWidget(self.actionsCollapsibleButton) # Layout within the dummy collapsible button self.actionsFormLayout = qt.QFormLayout(self.actionsCollapsibleButton) # # Export Area # self.exportCollapsibleButton = ctk.ctkCollapsibleButton() self.exportCollapsibleButton.text = "Export" self.layout.addWidget(self.exportCollapsibleButton) self.exportCollapsibleButton.enabled = False self.exportFormLayout = qt.QFormLayout(self.exportCollapsibleButton) self.sizeSelector = qt.QComboBox() for size in self.sizes.keys(): self.sizeSelector.addItem(size) self.sizeSelector.currentText = self.defaultSize self.exportFormLayout.addRow("Animation size", self.sizeSelector) self.fileFormatSelector = qt.QComboBox() for format in self.fileFormats.keys(): self.fileFormatSelector.addItem(format) self.fileFormatSelector.currentText = self.defaultFileFormat self.exportFormLayout.addRow("Animation format", self.fileFormatSelector) self.outputFileButton = qt.QPushButton("Select a file...") self.exportFormLayout.addRow("Output file", self.outputFileButton) self.exportButton = qt.QPushButton("Export") self.exportButton.enabled = False self.exportFormLayout.addRow("", self.exportButton) # connections self.animationSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.onSelect) self.outputFileButton.connect("clicked()", self.selectExportFile) self.exportButton.connect("clicked()", self.onExport) # Add vertical spacer self.layout.addStretch(1)
def setup(self): """ Called when the user opens the module the first time and the widget is initialized. """ ScriptedLoadableModuleWidget.setup(self) # Load widget from .ui file (created by Qt Designer). # Additional widgets can be instantiated manually and added to self.layout. uiWidget = slicer.util.loadUI(self.resourcePath('UI/LeadOR.ui')) self.layout.addWidget(uiWidget) self.ui = slicer.util.childWidgetVariables(uiWidget) if hasattr(slicer, 'vtkMRMLFiberBundleNode') and hasattr( slicer.vtkMRMLFiberBundleNode, 'GetExtractFromROI'): self.ui.stimulationCollapsibleButton.enabled = True else: self.ui.stimulationCollapsibleButton.enabled = False self.ui.stimulationCollapsibleButton.collapsed = True self.ui.stimulationCollapsibleButton.setToolTip( 'Updated SlicerDMRI Extension needed for stimulation module') # AO Channels actions to ToolButton stimulationActionGroup = qt.QActionGroup(self.layout) for child in self.ui.microElectrodeLayoutFrame.children(): if isinstance(child, qt.QToolButton): # channel AOChannelsAction = qt.QAction('AO Channels', self.layout) AOChannelsAction.setEnabled(False) AOChannelsAction.setMenu(qt.QMenu(child)) child.addAction(AOChannelsAction) # stim stimulationAction = qt.QAction('Stim Source', self.layout) stimulationAction.setCheckable(True) stimulationAction.setEnabled(True) stimulationAction.toggled.connect( self.updateStimulationTransform) stimulationActionGroup.addAction(stimulationAction) child.addAction(stimulationAction) # 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. uiWidget.setMRMLScene(slicer.mrmlScene) # Create logic class. Logic implements all computations that should be possible to run # in batch mode, without a graphical user interface. self.logic = LeadORLogic() # Connections # These connections ensure that we update parameter node when scene is closed self.addObserver(slicer.mrmlScene, slicer.mrmlScene.StartCloseEvent, self.onSceneStartClose) self.addObserver(slicer.mrmlScene, slicer.mrmlScene.EndCloseEvent, self.onSceneEndClose) # These connections ensure that whenever user changes some settings on the GUI, that is saved in the MRML scene # (in the selected parameter node). self.ui.distanceToTargetComboBox.connect( "currentNodeChanged(vtkMRMLNode*)", self.updateParameterNodeFromGUI) self.ui.trajectoryTransformComboBox.connect( "currentNodeChanged(vtkMRMLNode*)", self.updateParameterNodeFromGUI) self.ui.trajectoryTransformComboBox.connect( "currentNodeChanged(vtkMRMLNode*)", self.guessSideFromTransform) # transforms hierarchy self.ui.distanceToTargetComboBox.connect( "currentNodeChanged(vtkMRMLNode*)", self.setTransformsHierarchy) self.ui.trajectoryTransformComboBox.connect( "currentNodeChanged(vtkMRMLNode*)", self.setTransformsHierarchy) # reset ME when distance to target node change self.ui.distanceToTargetComboBox.currentNodeChanged.connect( lambda b, enabledList=[0] * 9: self.setMELayout(enabledList)) # distance to target slider self.ui.distanceToTargetComboBox.connect( "currentNodeChanged(vtkMRMLNode*)", lambda node: self.ui. distanceToTargetSlider.setMRMLTransformNode(node)) self.ui.distanceToTargetSlider.connect( "valueChanged(double)", lambda value: self.ui. distanceToTargetSlider.applyTransformation(value)) # micro electrode layouts self.ui.MECenterLayoutPushButton.clicked.connect( lambda b, enabledList=[0, 0, 0, 0, 1, 0, 0, 0, 0 ]: self.setMELayout(enabledList)) self.ui.MEPlusLayoutPushButton.clicked.connect( lambda b, enabledList=[0, 1, 0, 1, 1, 1, 0, 1, 0 ]: self.setMELayout(enabledList)) self.ui.MEXLayoutPushButton.clicked.connect( lambda b, enabledList=[1, 0, 1, 0, 1, 0, 1, 0, 1 ]: self.setMELayout(enabledList)) # add connection for each micro electro toggle button for child in self.ui.microElectrodeLayoutFrame.children(): if isinstance(child, qt.QToolButton): child.toggled.connect( lambda b, N=int(child.objectName.split('_')[-1] ): self.microElectrodeLayoutToggle(b, N)) # ME visibility self.ui.MEModelVisCheckBox.toggled.connect( lambda b: self.logic.setMEVisibility('microElectrodeModel', b)) self.ui.MELineVisCheckBox.toggled.connect( lambda b: self.logic.setMEVisibility('trajectoryLine', b)) self.ui.METipVisCheckBox.toggled.connect( lambda b: self.logic.setMEVisibility('tipFiducial', b)) self.ui.METraceVisCheckBox.toggled.connect( lambda b: self.logic.setMEVisibility('traceModel', b)) self.ui.MEClustersCheckBox.toggled.connect( lambda b: self.logic.setMEVisibility('clusterFiducials', b)) # Stimulation self.ui.stimulationActiveCheckBox.connect('toggled(bool)', self.onStimulationActivate) self.ui.stimulationAmplitudeSpinBox.valueChanged.connect( self.updateStimulationRadius) # Make sure parameter node is initialized (needed for module reload) self.initializeParameterNode() # AlphaOmega parameter node (Singleton) try: AOParameterNode = slicer.modules.alphaomega.logic( ).getParameterNode() self.addObserver(AOParameterNode, vtk.vtkCommand.ModifiedEvent, self.updateParameterNodeFromAO) self.updateParameterNodeFromAO(AOParameterNode, None) except: pass
def _addSubMenu(self, menu, layer, volumeClass): subMenuBackground = qt.QMenu(layer, menu) subMenuBackground.name = menu.name menu.addMenu(subMenuBackground) self._addActions(subMenuBackground, layer, volumeClass)
def _addMenu(self, button): menu = qt.QMenu(button) menu.name = button.name button.setMenu(menu) menu.aboutToShow.connect(lambda m=menu: self._onMenuSelected(m))