def __init__(self, parent): vLayout = qt.QVBoxLayout(parent) hLayout = qt.QHBoxLayout() self.icon = qt.QLabel() self.icon.setPixmap(_dialogIcon(qt.QStyle.SP_MessageBoxQuestion)) hLayout.addWidget(self.icon, 0) self.label = qt.QLabel() self.label.wordWrap = True hLayout.addWidget(self.label, 1) vLayout.addLayout(hLayout) self.moduleList = qt.QListWidget() self.moduleList.selectionMode = qt.QAbstractItemView.NoSelection vLayout.addWidget(self.moduleList) self.addToSearchPaths = qt.QCheckBox() vLayout.addWidget(self.addToSearchPaths) self.enableDeveloperMode = qt.QCheckBox() self.enableDeveloperMode.text = "Enable developer mode" self.enableDeveloperMode.toolTip = "Sets the 'Developer mode' application option to enabled. Enabling developer mode is recommended while developing scripted modules, as it makes the Reload and Testing section displayed in the module user interface." self.enableDeveloperMode.checked = True vLayout.addWidget(self.enableDeveloperMode) self.buttonBox = qt.QDialogButtonBox() self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Yes | qt.QDialogButtonBox.No) vLayout.addWidget(self.buttonBox)
def open(self): # main dialog self.dialog = qt.QDialog(slicer.util.mainWindow()) self.dialog.setWindowTitle('Send DICOM Study') self.dialog.setWindowModality(1) layout = qt.QVBoxLayout() self.dialog.setLayout(layout) self.studyLabel = qt.QLabel('Send %d items to destination' % len(self.files)) layout.addWidget(self.studyLabel) # Send Parameters self.dicomFrame = qt.QFrame(self.dialog) self.dicomFormLayout = qt.QFormLayout() self.dicomFrame.setLayout(self.dicomFormLayout) self.dicomEntries = {} self.dicomParameters = { "Destination Address": self.sendAddress, "Destination Port": self.sendPort } for label in self.dicomParameters.keys(): self.dicomEntries[label] = qt.QLineEdit() self.dicomEntries[label].text = self.dicomParameters[label] self.dicomFormLayout.addRow(label+": ", self.dicomEntries[label]) layout.addWidget(self.dicomFrame) # button box bbox = qt.QDialogButtonBox(self.dialog) bbox.addButton(bbox.Ok) bbox.addButton(bbox.Cancel) bbox.connect('accepted()', self.onOk) bbox.connect('rejected()', self.onCancel) layout.addWidget(bbox) self.dialog.open()
def createUserInterface(self): self.__layout = self.__parent.createUserInterface() self.__spacerLabel = qt.QLabel(" ") self.__layout.addRow(self.__spacerLabel) # self.__segmentationSectionLabel = qt.QLabel("Fix the Level-set Segmentation:") # self.__layout.addRow(self.__segmentationSectionLabel) self.__ioAdvancedPanel = qt.QFrame(self) print "testss" self.__ioAdvancedPanel.setFrameStyle(6) self.__layout.addRow(self.__ioAdvancedPanel) # self.__ioAdvancedToggle.connect("clicked()", self.onIOAdvancedToggle) ioAdvancedFormLayout = qt.QFormLayout(self.__ioAdvancedPanel) self.__buttonBox = qt.QDialogButtonBox() self.__resetButton = self.__buttonBox.addButton(self.__buttonBox.RestoreDefaults) self.__resetButton.text = "Undersegmentation" self.__resetButton.toolTip = "Click to perfom an Undersegmentation." self.__previewButton = self.__buttonBox.addButton(self.__buttonBox.Discard) self.__previewButton.setIcon(qt.QIcon()) self.__previewButton.text = "Oversegmentation" self.__previewButton.toolTip = "Click to perfom an Oversegmentation." # self.__startButton = self.__buttonBox.addButton(self.__buttonBox.Apply) # self.__startButton.setIcon(qt.QIcon()) # self.__startButton.text = "Start!" # self.__startButton.enabled = False # self.__startButton.toolTip = "Click to start the filtering." ioAdvancedFormLayout.addWidget(self.__buttonBox)
def __init__(self, parent): vLayout = qt.QVBoxLayout(parent) formLayout = qt.QFormLayout() self.nameEdit = qt.QLineEdit() formLayout.addRow("Name:", self.nameEdit) self.categoryEdit = qt.QLineEdit() formLayout.addRow("Category:", self.categoryEdit) self.descriptionEdit = qt.QTextEdit() self.descriptionEdit.acceptRichText = False formLayout.addRow("Description:", self.descriptionEdit) self.contributorsList = EditableTreeWidget() self.contributorsList.rootIsDecorated = False self.contributorsList.selectionBehavior = qt.QAbstractItemView.SelectRows self.contributorsList.selectionMode = qt.QAbstractItemView.ExtendedSelection self.contributorsList.setHeaderLabels(["Name", "Organization"]) formLayout.addRow("Contributors:", self.contributorsList) vLayout.addLayout(formLayout) vLayout.addStretch(1) self.buttonBox = qt.QDialogButtonBox() self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Ok | qt.QDialogButtonBox.Cancel) vLayout.addWidget(self.buttonBox)
def __init__(self, parent): vLayout = qt.QVBoxLayout(parent) hLayout = qt.QHBoxLayout() self.icon = qt.QLabel() self.icon.setPixmap(_dialogIcon(qt.QStyle.SP_MessageBoxQuestion)) hLayout.addWidget(self.icon, 0) self.label = qt.QLabel() self.label.wordWrap = True hLayout.addWidget(self.label, 1) vLayout.addLayout(hLayout) self.moduleList = qt.QListWidget() self.moduleList.selectionMode = qt.QAbstractItemView.NoSelection vLayout.addWidget(self.moduleList) self.addToSearchPaths = qt.QCheckBox() vLayout.addWidget(self.addToSearchPaths) self.buttonBox = qt.QDialogButtonBox() self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Yes | qt.QDialogButtonBox.No) vLayout.addWidget(self.buttonBox)
def __createButtons(self): """ As stated. """ self.addButton = qt.QPushButton() self.addButton.setText("Add") self.addButton.setEnabled(False) self.cancelButton = qt.QPushButton() self.cancelButton.setText("Cancel") self.buttonRow = qt.QDialogButtonBox() self.buttonRow.addButton(self.cancelButton, 2) self.buttonRow.addButton(self.addButton, 0) self.buttonRow.connect('clicked(QAbstractButton*)', self.__onButtonClicked)
def createUserInterface( self ): ''' ''' self.buttonBoxHints = self.ButtonBoxHidden self.__layout = self.__parent.createUserInterface() # let's load all tasks self.loadTasks() self.loadPreprocessingTasks() selectTaskLabel = qt.QLabel( 'Select Task' ) selectTaskLabel.setFont( self.__parent.getBoldFont() ) self.__layout.addRow( selectTaskLabel ) self.__taskComboBox = qt.QComboBox() self.__taskComboBox.toolTip = "Choose a task." # fill the comboBox with the taskNames self.__taskComboBox.addItems( self.getTaskNames() ) # TODO select MRI Human Brain as default self.__taskComboBox.connect( 'currentIndexChanged(int)', self.onTaskSelected ) self.__layout.addRow( Helper.CreateSpace( 20 ), self.__taskComboBox ) # add empty row self.__layout.addRow( "", qt.QWidget() ) chooseModeLabel = qt.QLabel( 'Choose Mode' ) chooseModeLabel.setFont( self.__parent.getBoldFont() ) self.__layout.addRow( chooseModeLabel ) self.__buttonBox = qt.QDialogButtonBox() simpleButton = self.__buttonBox.addButton( self.__buttonBox.Discard ) simpleButton.setIcon( qt.QIcon() ) simpleButton.text = "Simple" simpleButton.toolTip = "Click to use the simple mode." advancedButton = self.__buttonBox.addButton( self.__buttonBox.Apply ) advancedButton.setIcon( qt.QIcon() ) advancedButton.text = "Advanced" advancedButton.toolTip = "Click to use the advanced mode." self.__layout.addWidget( self.__buttonBox ) # connect the simple and advanced buttons simpleButton.connect( 'clicked()', self.goSimple ) advancedButton.connect( 'clicked()', self.goAdvanced )
def onTaskSelected( self ): ''' ''' index = self.__taskComboBox.currentIndex taskName = self.__taskComboBox.currentText # re-enable the simple and advanced buttons self.__buttonBox.enabled = True if taskName == self.__newTaskString: # create new task was selected # disable the simple and advanced buttons self.__buttonBox.enabled = False # create new dialog self.__d = qt.QDialog() dLayout = qt.QFormLayout( self.__d ) self.__nameEdit = qt.QLineEdit() dLayout.addRow( 'New Task Name:', self.__nameEdit ) self.__preprocessingComboBox = qt.QComboBox() list = self.__preprocessingTasksList.keys() list.sort( lambda x, y: cmp( x.lower(), y.lower() ) ) self.__preprocessingComboBox.addItems( list ) # also, add None self.__preprocessingComboBox.addItem( 'None' ) dLayout.addRow( 'Pre-processing:', self.__preprocessingComboBox ) buttonBox = qt.QDialogButtonBox() #cancelButton = buttonBox.addButton(buttonBox.Discard) #cancelButton.text = 'Cancel' okButton = buttonBox.addButton( buttonBox.Apply ) okButton.setIcon( qt.QIcon() ) okButton.text = 'Apply' okButton.connect( 'clicked()', self.createNewTask ) dLayout.addWidget( buttonBox ) self.__d.setModal( True ) self.__d.show()
def __init__(self, parent): self.vLayout = qt.QVBoxLayout(parent) self.formLayout = qt.QFormLayout() self.componentName = qt.QLineEdit() self.formLayout.addRow("Name:", self.componentName) self.componentType = qt.QComboBox() self.formLayout.addRow("Type:", self.componentType) self.destination = ctk.ctkPathLineEdit() self.destination.filters = ctk.ctkPathLineEdit.Dirs self.formLayout.addRow("Destination:", self.destination) self.vLayout.addLayout(self.formLayout) self.vLayout.addStretch(1) self.buttonBox = qt.QDialogButtonBox() self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Ok | qt.QDialogButtonBox.Cancel) self.vLayout.addWidget(self.buttonBox)
def open(self): # main dialog self.dialog = qt.QDialog(slicer.util.mainWindow()) self.dialog.setWindowTitle('Export to DICOM Study') self.dialog.setWindowModality(1) layout = qt.QVBoxLayout() self.dialog.setLayout(layout) self.studyLabel = qt.QLabel('Attach Data to Study: %s' % self.studyUID) layout.addWidget(self.studyLabel) # scene or volume option self.selectFrame = qt.QFrame(self.dialog) layout.addWidget(self.selectFrame) self.selectLayout = qt.QGridLayout() self.selectFrame.setLayout(self.selectLayout) self.exportScene = qt.QRadioButton("Export Entire Scene", self.selectFrame) self.exportScene.setToolTip( "Create a Slicer Data Bundle in a DICOM Private Creator\n(Only compatible with Slicer)" ) self.exportVolume = qt.QRadioButton("Export Selected Volume", self.selectFrame) self.exportVolume.setToolTip( "Create a compatible DICOM series of slice images") self.exportVolume.checked = True self.selectLayout.addWidget(self.exportScene, 0, 0) self.selectLayout.addWidget(self.exportVolume, 1, 0) self.exportScene.connect('toggled(bool)', self.onExportRadio) self.exportVolume.connect('toggled(bool)', self.onExportRadio) # select volume self.volumeSelector = slicer.qMRMLNodeComboBox(self.dialog) self.volumeSelector.nodeTypes = ("vtkMRMLScalarVolumeNode", "") self.volumeSelector.selectNodeUponCreation = False self.volumeSelector.addEnabled = False self.volumeSelector.noneEnabled = False self.volumeSelector.removeEnabled = False self.volumeSelector.showHidden = False self.volumeSelector.showChildNodeTypes = False self.volumeSelector.setMRMLScene(slicer.mrmlScene) self.volumeSelector.setToolTip("Pick the label map to edit") self.selectLayout.addWidget(self.volumeSelector, 1, 1) # DICOM Parameters self.dicomFrame = qt.QFrame(self.dialog) self.dicomFormLayout = qt.QFormLayout() self.dicomFrame.setLayout(self.dicomFormLayout) self.dicomEntries = {} exporter = DICOMLib.DICOMExporter(self.studyUID) self.dicomParameters = exporter.parametersFromStudy() self.dicomParameters['Series Description'] = '3D Slicer Export' for label in self.dicomParameters.keys(): self.dicomEntries[label] = qt.QLineEdit() self.dicomEntries[label].text = self.dicomParameters[label] self.dicomFormLayout.addRow(label + ": ", self.dicomEntries[label]) layout.addWidget(self.dicomFrame) # button box bbox = qt.QDialogButtonBox(self.dialog) bbox.addButton(bbox.Ok) bbox.addButton(bbox.Cancel) bbox.connect('accepted()', self.onOk) bbox.connect('rejected()', self.onCancel) layout.addWidget(bbox) self.dialog.open()
def __init__(self, MODULE, saveWorkflow): """ Init function. """ #-------------------- # Call parent. #-------------------- super(XnatFileSaveDialog, self).__init__(MODULE, saveWorkflow) self.MODULE = MODULE #-------------------- # Determine filename. #-------------------- self.fileName = None #-------------------- # Dialog setup. #-------------------- self.inputIndex = 0 self.noticeLabel = qt.QLabel("") #-------------------- # Window setup. #-------------------- self.setNumDialogs(1, {'0':qt.QDialog(slicer.util.mainWindow())}) self.dialogs[0].setFixedWidth(600) self.dialogs[0].setWindowModality(1) #-------------------- # Label button and fileLine. #-------------------- self.saveButtonStr = "Save" fileLineLabel = qt.QLabel("File Name: ") #-------------------- # Set fileline text (where user enters the file # name) #-------------------- self.fileLine = qt.QLineEdit(self.MODULE.View.sessionManager.sessionArgs['fileName'].split(XnatSlicerGlobals.DEFAULT_SLICER_EXTENSION)[0]) #-------------------- # Create file name input layout. #-------------------- fileInputLayout = qt.QHBoxLayout() fileInputLayout.addWidget(fileLineLabel) fileInputLayout.addWidget(self.fileLine) dialogLayout = qt.QVBoxLayout() #-------------------- # Create the buttons. #-------------------- saveButton = qt.QPushButton() saveButton.setText(self.saveButtonStr) cancelButton = qt.QPushButton() cancelButton.setText("Cancel") buttonRow = qt.QDialogButtonBox() buttonRow.addButton(saveButton, 0) buttonRow.addButton(cancelButton, 2) #-------------------- # Put buttons in the bottom row. #-------------------- bottomRow = qt.QHBoxLayout() bottomRow.addWidget(buttonRow) #-------------------- # Add the layouts to the dialog. #-------------------- dialogLayout.addLayout(fileInputLayout) dialogLayout.addWidget(self.noticeLabel) dialogLayout.addLayout(bottomRow) self.dialogs[0].setLayout(dialogLayout) #-------------------- # Set onClick connections. #-------------------- buttonRow.connect('clicked(QAbstractButton*)', self.onButtonClicked)
def createUserInterface(self): ''' ''' self.buttonBoxHints = self.ButtonBoxHidden self.__layout = super(EMSegmentSelectTaskStep, self).createUserInterface() # let's load all tasks self.loadTasks() self.loadPreprocessingTasks() eminfoLabel = qt.QLabel( 'This module provides EM segmentation based on an atlas.\nBy defining an anatomical tree, different structures can be segmented.\n\n' ) eminfoLabel.setFont(self.getBoldFont()) self.__layout.addRow(eminfoLabel) selectTaskLabel = qt.QLabel('Select Task') selectTaskLabel.setFont(self.getBoldFont()) self.__layout.addRow(selectTaskLabel) self.__taskComboBox = qt.QComboBox() self.__taskComboBox.toolTip = "Choose a task." # fill the comboBox with the taskNames self.__taskComboBox.addItems(self.getTaskNames()) self.__taskComboBox.setCurrentIndex( self.__taskComboBox.findText('MRI Human Brain')) self.__taskComboBox.connect('currentIndexChanged(int)', self.onTaskSelected) self.__layout.addRow(Helper.CreateSpace(20), self.__taskComboBox) infoLabel = qt.QLabel( 'For more information about the tasks click here:') self.__layout.addRow(Helper.CreateSpace(20), infoLabel) urlLabel = qt.QLabel( '<a href=http://www.slicer.org/slicerWiki/index.php/EMSegmenter-Tasks>http://www.slicer.org/slicerWiki/index.php/EMSegmenter-Tasks</a>' ) urlLabel.setOpenExternalLinks(True) self.__layout.addRow(Helper.CreateSpace(20), urlLabel) # add empty row self.__layout.addRow("", qt.QWidget()) # add empty row self.__layout.addRow("", qt.QWidget()) # add empty row self.__layout.addRow("", qt.QWidget()) # add empty row self.__layout.addRow("", qt.QWidget()) chooseModeLabel = qt.QLabel('Choose Mode') chooseModeLabel.setFont(self.getBoldFont()) self.__layout.addRow(chooseModeLabel) self.__buttonBox = qt.QDialogButtonBox() simpleButton = self.__buttonBox.addButton(self.__buttonBox.Discard) simpleButton.setIcon(qt.QIcon()) simpleButton.text = "Simple" simpleButton.toolTip = "Click to use the simple mode." advancedButton = self.__buttonBox.addButton(self.__buttonBox.Apply) advancedButton.setIcon(qt.QIcon()) advancedButton.text = "Advanced" advancedButton.toolTip = "Click to use the advanced mode." self.__layout.addWidget(self.__buttonBox) # connect the simple and advanced buttons simpleButton.connect('clicked()', self.goSimple) advancedButton.connect('clicked()', self.goAdvanced)
def __init__(self, parent, MODULE=None): """ Init function. """ self.MODULE = MODULE #-------------------- # Call parent init. #-------------------- super(XnatFolderMaker, self).__init__() #-------------------- # Adjust window features. #-------------------- self.setWindowTitle("Add Folder to Xnat") self.setWindowModality(2) #-------------------- # Hide the widget initially. #-------------------- self.hide() #-------------------- # Set fixed width. #-------------------- self.setFixedWidth(500) self.setFixedHeight(250) #-------------------- # Make the xsiList for experiment # creation. #-------------------- self.xsiList = qt.QComboBox() self.xsiList.addItems([ key for key, value in self.MODULE.GLOBALS.XNAT_XSI_TYPES.iteritems() ]) #-------------------- # Displayable wigets. #-------------------- self.levelLabels = {} self.nameLabels = {} self.lineEdits = {} self.errorLines = {} self.levelLayouts = {} self.labelLineStacks = {} self.levelRows = {} #-------------------- # Make the buttons: # create, cancel, # etc. #-------------------- self.addButton = qt.QPushButton() self.addButton.setText("Add") self.addButton.setEnabled(False) self.cancelButton = qt.QPushButton() self.cancelButton.setText("Cancel") buttonRow = qt.QDialogButtonBox() buttonRow.addButton(self.cancelButton, 2) buttonRow.addButton(self.addButton, 0) #------------------- # Create the keys in the displayable widgets. #-------------------- self.addFolderXnatLevels = ['projects', 'subjects', 'experiments'] for level in self.addFolderXnatLevels: # # Labels (name and level) # self.levelLabels[level] = qt.QLabel(self) self.levelLabels[level].setFixedHeight(25) self.nameLabels[level] = qt.QLabel(self) self.nameLabels[level].setFixedHeight(25) # # Line edits # self.lineEdits[level] = qt.QLineEdit(self) self.lineEdits[level].installEventFilter(self) self.lineEdits[level].setFixedHeight(25) # # Error lines # self.errorLines[level] = qt.QLabel(self) self.errorLines[level].setTextFormat(1) self.errorLines[level].setFixedHeight(25) # # Make the label-line stacks, adjusting # for 'experiments' as necessary. # self.labelLineStacks[level] = qt.QStackedLayout() if level == 'experiments': experimentRow = qt.QHBoxLayout() experimentRow.addWidget(self.xsiList) experimentRow.addWidget(self.lineEdits[level]) experimentWidget = qt.QWidget() experimentWidget.setLayout(experimentRow) self.labelLineStacks[level].addWidget(experimentWidget) else: self.labelLineStacks[level].addWidget(self.nameLabels[level]) self.labelLineStacks[level].addWidget(self.lineEdits[level]) # # make row widgets # self.levelRows[level] = qt.QWidget(self) levelRowLayout = qt.QGridLayout() levelRowLayout.addWidget(self.levelLabels[level], 0, 0) levelRowLayout.addLayout(self.labelLineStacks[level], 0, 1) levelRowLayout.addWidget(self.errorLines[level], 1, 1) self.levelRows[level].setLayout(levelRowLayout) #-------------------- # Connect button click events. #-------------------- buttonRow.connect('clicked(QAbstractButton*)', self.onAddButtonClicked) #-------------------- # Make the mainLayout and add all widgets. #-------------------- self.mainLayout = qt.QVBoxLayout() for level in self.addFolderXnatLevels: self.mainLayout.addWidget(self.levelRows[level]) self.mainLayout.addStretch() self.mainLayout.addWidget(buttonRow) self.setLayout(self.mainLayout)
def setup(self): # check if the SlicerVmtk module is installed properly # self.__vmtkInstalled = SlicerVmtkCommonLib.Helper.CheckIfVmtkIsInstalled() # Helper.Debug("VMTK found: " + self.__vmtkInstalled) # # the I/O panel # ioCollapsibleButton = ctk.ctkCollapsibleButton() ioCollapsibleButton.text = "Input/Output" self.layout.addWidget(ioCollapsibleButton) ioFormLayout = qt.QFormLayout(ioCollapsibleButton) # inputVolume selector self.__inputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__inputVolumeNodeSelector.objectName = 'inputVolumeNodeSelector' self.__inputVolumeNodeSelector.toolTip = "Select the input volume. This should always be the original image and not a vesselness image, if possible." self.__inputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.__inputVolumeNodeSelector.noneEnabled = False self.__inputVolumeNodeSelector.addEnabled = False self.__inputVolumeNodeSelector.removeEnabled = False self.__inputVolumeNodeSelector.addAttribute("vtkMRMLScalarVolumeNode", "LabelMap", "0") ioFormLayout.addRow("Input Volume:", self.__inputVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__inputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.__inputVolumeNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onInputVolumeChanged) self.__inputVolumeNodeSelector.connect('nodeActivated(vtkMRMLNode*)', self.onInputVolumeChanged) # seed selector self.__seedFiducialsNodeSelector = slicer.qMRMLNodeComboBox() self.__seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector' self.__seedFiducialsNodeSelector.toolTip = "Select a hierarchy containing the fiducials to use as Seeds." self.__seedFiducialsNodeSelector.nodeTypes = [ 'vtkMRMLAnnotationHierarchyNode' ] self.__seedFiducialsNodeSelector.baseName = "Seeds" self.__seedFiducialsNodeSelector.noneEnabled = False self.__seedFiducialsNodeSelector.addEnabled = False self.__seedFiducialsNodeSelector.removeEnabled = False ioFormLayout.addRow("Seeds:", self.__seedFiducialsNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__seedFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.__ioAdvancedToggle = qt.QCheckBox("Show Advanced I/O Properties") self.__ioAdvancedToggle.setChecked(False) ioFormLayout.addRow(self.__ioAdvancedToggle) # # I/O advanced panel # self.__ioAdvancedPanel = qt.QFrame(ioCollapsibleButton) self.__ioAdvancedPanel.hide() self.__ioAdvancedPanel.setFrameStyle(6) ioFormLayout.addRow(self.__ioAdvancedPanel) self.__ioAdvancedToggle.connect("clicked()", self.onIOAdvancedToggle) ioAdvancedFormLayout = qt.QFormLayout(self.__ioAdvancedPanel) # inputVolume selector self.__vesselnessVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__vesselnessVolumeNodeSelector.objectName = 'vesselnessVolumeNodeSelector' self.__vesselnessVolumeNodeSelector.toolTip = "Select the input vesselness volume. This is optional input." self.__vesselnessVolumeNodeSelector.nodeTypes = [ 'vtkMRMLScalarVolumeNode' ] self.__vesselnessVolumeNodeSelector.noneEnabled = True self.__vesselnessVolumeNodeSelector.addEnabled = False self.__vesselnessVolumeNodeSelector.removeEnabled = False self.__vesselnessVolumeNodeSelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", "0") ioAdvancedFormLayout.addRow("Vesselness Volume:", self.__vesselnessVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__vesselnessVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.__vesselnessVolumeNodeSelector.setCurrentNode(None) # stopper selector self.__stopperFiducialsNodeSelector = slicer.qMRMLNodeComboBox() self.__stopperFiducialsNodeSelector.objectName = 'stopperFiducialsNodeSelector' self.__stopperFiducialsNodeSelector.toolTip = "Select a hierarchy containing the fiducials to use as Stoppers. Whenever one stopper is reached, the segmentation stops." self.__stopperFiducialsNodeSelector.nodeTypes = [ 'vtkMRMLAnnotationHierarchyNode' ] self.__stopperFiducialsNodeSelector.baseName = "Stoppers" self.__stopperFiducialsNodeSelector.noneEnabled = False self.__stopperFiducialsNodeSelector.addEnabled = True self.__stopperFiducialsNodeSelector.removeEnabled = False ioAdvancedFormLayout.addRow("Stoppers:", self.__stopperFiducialsNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__stopperFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # outputVolume selector self.__outputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__outputVolumeNodeSelector.toolTip = "Select the output labelmap." self.__outputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.__outputVolumeNodeSelector.baseName = "LevelSetSegmentation" self.__outputVolumeNodeSelector.noneEnabled = False self.__outputVolumeNodeSelector.addEnabled = True self.__outputVolumeNodeSelector.selectNodeUponCreation = True self.__outputVolumeNodeSelector.addAttribute("vtkMRMLScalarVolumeNode", "LabelMap", "1") self.__outputVolumeNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow("Output Labelmap:", self.__outputVolumeNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__outputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # outputModel selector self.__outputModelNodeSelector = slicer.qMRMLNodeComboBox() self.__outputModelNodeSelector.objectName = 'outputModelNodeSelector' self.__outputModelNodeSelector.toolTip = "Select the output model." self.__outputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.__outputModelNodeSelector.baseName = "LevelSetSegmentationModel" self.__outputModelNodeSelector.hideChildNodeTypes = [ 'vtkMRMLAnnotationNode' ] # hide all annotation nodes self.__outputModelNodeSelector.noneEnabled = False self.__outputModelNodeSelector.addEnabled = True self.__outputModelNodeSelector.selectNodeUponCreation = True self.__outputModelNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow("Output Model:", self.__outputModelNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__outputModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # # the segmentation panel # segmentationCollapsibleButton = ctk.ctkCollapsibleButton() segmentationCollapsibleButton.text = "Segmentation" self.layout.addWidget(segmentationCollapsibleButton) segmentationFormLayout = qt.QFormLayout(segmentationCollapsibleButton) # Threshold slider thresholdLabel = qt.QLabel() thresholdLabel.text = "Thresholding" + SlicerVmtkCommonLib.Helper.CreateSpace( 7) thresholdLabel.toolTip = "Choose the intensity range to segment." thresholdLabel.setAlignment(4) segmentationFormLayout.addRow(thresholdLabel) self.__thresholdSlider = slicer.qMRMLRangeWidget() segmentationFormLayout.addRow(self.__thresholdSlider) self.__thresholdSlider.connect('valuesChanged(double,double)', self.onThresholdSliderChanged) self.__segmentationAdvancedToggle = qt.QCheckBox( "Show Advanced Segmentation Properties") self.__segmentationAdvancedToggle.setChecked(False) segmentationFormLayout.addRow(self.__segmentationAdvancedToggle) # # segmentation advanced panel # self.__segmentationAdvancedPanel = qt.QFrame( segmentationCollapsibleButton) self.__segmentationAdvancedPanel.hide() self.__segmentationAdvancedPanel.setFrameStyle(6) segmentationFormLayout.addRow(self.__segmentationAdvancedPanel) self.__segmentationAdvancedToggle.connect( "clicked()", self.onSegmentationAdvancedToggle) segmentationAdvancedFormLayout = qt.QFormLayout( self.__segmentationAdvancedPanel) # inflation slider inflationLabel = qt.QLabel() inflationLabel.text = "less inflation <-> more inflation" + SlicerVmtkCommonLib.Helper.CreateSpace( 14) inflationLabel.setAlignment(4) inflationLabel.toolTip = "Define how fast the segmentation expands." segmentationAdvancedFormLayout.addRow(inflationLabel) self.__inflationSlider = ctk.ctkSliderWidget() self.__inflationSlider.decimals = 0 self.__inflationSlider.minimum = -100 self.__inflationSlider.maximum = 100 self.__inflationSlider.singleStep = 10 self.__inflationSlider.toolTip = inflationLabel.toolTip segmentationAdvancedFormLayout.addRow(self.__inflationSlider) # curvature slider curvatureLabel = qt.QLabel() curvatureLabel.text = "less curvature <-> more curvature" + SlicerVmtkCommonLib.Helper.CreateSpace( 14) curvatureLabel.setAlignment(4) curvatureLabel.toolTip = "Choose a high curvature to generate a smooth segmentation." segmentationAdvancedFormLayout.addRow(curvatureLabel) self.__curvatureSlider = ctk.ctkSliderWidget() self.__curvatureSlider.decimals = 0 self.__curvatureSlider.minimum = -100 self.__curvatureSlider.maximum = 100 self.__curvatureSlider.singleStep = 10 self.__curvatureSlider.toolTip = curvatureLabel.toolTip segmentationAdvancedFormLayout.addRow(self.__curvatureSlider) # attraction slider attractionLabel = qt.QLabel() attractionLabel.text = "less attraction to gradient <-> more attraction to gradient" + SlicerVmtkCommonLib.Helper.CreateSpace( 14) attractionLabel.setAlignment(4) attractionLabel.toolTip = "Configure how the segmentation travels towards gradient ridges (vessel lumen wall)." segmentationAdvancedFormLayout.addRow(attractionLabel) self.__attractionSlider = ctk.ctkSliderWidget() self.__attractionSlider.decimals = 0 self.__attractionSlider.minimum = -100 self.__attractionSlider.maximum = 100 self.__attractionSlider.singleStep = 10 self.__attractionSlider.toolTip = attractionLabel.toolTip segmentationAdvancedFormLayout.addRow(self.__attractionSlider) # iteration spinbox self.__iterationSpinBox = qt.QSpinBox() self.__iterationSpinBox.minimum = 0 self.__iterationSpinBox.maximum = 5000 self.__iterationSpinBox.singleStep = 10 self.__iterationSpinBox.toolTip = "Choose the number of evolution iterations." segmentationAdvancedFormLayout.addRow( SlicerVmtkCommonLib.Helper.CreateSpace(100) + "Iterations:", self.__iterationSpinBox) # # Reset, preview and apply buttons # self.__buttonBox = qt.QDialogButtonBox() self.__resetButton = self.__buttonBox.addButton( self.__buttonBox.RestoreDefaults) self.__resetButton.toolTip = "Click to reset all input elements to default." self.__previewButton = self.__buttonBox.addButton( self.__buttonBox.Discard) self.__previewButton.setIcon(qt.QIcon()) self.__previewButton.text = "Preview.." self.__previewButton.toolTip = "Click to refresh the preview." self.__startButton = self.__buttonBox.addButton(self.__buttonBox.Apply) self.__startButton.setIcon(qt.QIcon()) self.__startButton.text = "Start!" self.__startButton.enabled = False self.__startButton.toolTip = "Click to start the filtering." self.layout.addWidget(self.__buttonBox) self.__resetButton.connect("clicked()", self.restoreDefaults) self.__previewButton.connect("clicked()", self.onRefreshButtonClicked) self.__startButton.connect("clicked()", self.onStartButtonClicked) # be ready for events self.__updating = 0 # set default values self.restoreDefaults() # compress the layout self.layout.addStretch(1)
def setup( self ): # check if the SlicerVmtk module is installed properly # self.__vmtkInstalled = SlicerVmtkCommonLib.Helper.CheckIfVmtkIsInstalled() # Helper.Debug("VMTK found: " + self.__vmtkInstalled) # # the I/O panel # ioCollapsibleButton = ctk.ctkCollapsibleButton() ioCollapsibleButton.text = "Input/Output" self.layout.addWidget( ioCollapsibleButton ) ioFormLayout = qt.QFormLayout( ioCollapsibleButton ) # inputVolume selector self.__inputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__inputVolumeNodeSelector.objectName = 'inputVolumeNodeSelector' self.__inputVolumeNodeSelector.toolTip = "Select the input volume." self.__inputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.__inputVolumeNodeSelector.noneEnabled = False self.__inputVolumeNodeSelector.addEnabled = False self.__inputVolumeNodeSelector.removeEnabled = False self.__inputVolumeNodeSelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", "0" ) ioFormLayout.addRow( "Input Volume:", self.__inputVolumeNodeSelector ) self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)', self.__inputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)' ) self.__inputVolumeNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onInputVolumeChanged ) # seed selector self.__seedFiducialsNodeSelector = slicer.qMRMLNodeComboBox() self.__seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector' self.__seedFiducialsNodeSelector.toolTip = "Select a fiducial to use as a Seed to detect the maximal diameter." self.__seedFiducialsNodeSelector.nodeTypes = ['vtkMRMLAnnotationFiducialNode'] self.__seedFiducialsNodeSelector.baseName = "DiameterSeed" self.__seedFiducialsNodeSelector.noneEnabled = False self.__seedFiducialsNodeSelector.addEnabled = False self.__seedFiducialsNodeSelector.removeEnabled = False ioFormLayout.addRow( "Seed in largest Vessel:", self.__seedFiducialsNodeSelector ) self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)', self.__seedFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)' ) self.__seedFiducialsNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onSeedChanged ) self.__ioAdvancedToggle = qt.QCheckBox( "Show Advanced Properties" ) self.__ioAdvancedToggle.setChecked( False ) ioFormLayout.addRow( self.__ioAdvancedToggle ) # # I/O advanced panel # self.__ioAdvancedPanel = qt.QFrame( ioCollapsibleButton ) self.__ioAdvancedPanel.hide() self.__ioAdvancedPanel.setFrameStyle( 6 ) ioFormLayout.addRow( self.__ioAdvancedPanel ) self.__ioAdvancedToggle.connect( "clicked()", self.onIOAdvancedToggle ) ioAdvancedFormLayout = qt.QFormLayout( self.__ioAdvancedPanel ) # lock button self.__detectPushButton = qt.QPushButton() self.__detectPushButton.text = "Detect parameters automatically" self.__detectPushButton.checkable = True self.__detectPushButton.checked = True # self.__unLockPushButton.connect("clicked()", self.calculateParameters()) ioAdvancedFormLayout.addRow( self.__detectPushButton ) # outputVolume selector self.__outputVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__outputVolumeNodeSelector.toolTip = "Select the output labelmap." self.__outputVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.__outputVolumeNodeSelector.baseName = "VesselnessFiltered" self.__outputVolumeNodeSelector.noneEnabled = False self.__outputVolumeNodeSelector.addEnabled = True self.__outputVolumeNodeSelector.selectNodeUponCreation = True self.__outputVolumeNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow( "Output Volume:", self.__outputVolumeNodeSelector ) self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)', self.__outputVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)' ) # previewVolume selector self.__previewVolumeNodeSelector = slicer.qMRMLNodeComboBox() self.__previewVolumeNodeSelector.toolTip = "Select the preview volume." self.__previewVolumeNodeSelector.nodeTypes = ['vtkMRMLScalarVolumeNode'] self.__previewVolumeNodeSelector.baseName = "VesselnessPreview" self.__previewVolumeNodeSelector.noneEnabled = False self.__previewVolumeNodeSelector.addEnabled = True self.__previewVolumeNodeSelector.selectNodeUponCreation = True self.__previewVolumeNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow( "Preview Volume:", self.__previewVolumeNodeSelector ) self.parent.connect( 'mrmlSceneChanged(vtkMRMLScene*)', self.__previewVolumeNodeSelector, 'setMRMLScene(vtkMRMLScene*)' ) self.__minimumDiameterSpinBox = qt.QSpinBox() self.__minimumDiameterSpinBox.minimum = 0 self.__minimumDiameterSpinBox.maximum = 1000 self.__minimumDiameterSpinBox.singleStep = 1 self.__minimumDiameterSpinBox.toolTip = "Specify the minimum Diameter manually." ioAdvancedFormLayout.addRow( "Minimum Diameter [vx]:", self.__minimumDiameterSpinBox ) self.__maximumDiameterSpinBox = qt.QSpinBox() self.__maximumDiameterSpinBox.minimum = 0 self.__maximumDiameterSpinBox.maximum = 1000 self.__maximumDiameterSpinBox.singleStep = 1 self.__maximumDiameterSpinBox.toolTip = "Specify the maximum Diameter manually." ioAdvancedFormLayout.addRow( "Maximum Diameter [vx]:", self.__maximumDiameterSpinBox ) # add empty row ioAdvancedFormLayout.addRow( "", qt.QWidget() ) # alpha slider alphaLabel = qt.QLabel() alphaLabel.text = "more Tubes <-> more Plates" + SlicerVmtkCommonLib.Helper.CreateSpace( 16 ) alphaLabel.setAlignment( 4 ) alphaLabel.toolTip = "A lower value detects tubes rather than plate-like structures." ioAdvancedFormLayout.addRow( alphaLabel ) self.__alphaSlider = ctk.ctkSliderWidget() self.__alphaSlider.decimals = 1 self.__alphaSlider.minimum = 0.1 self.__alphaSlider.maximum = 500 self.__alphaSlider.singleStep = 0.1 self.__alphaSlider.toolTip = alphaLabel.toolTip ioAdvancedFormLayout.addRow( self.__alphaSlider ) # beta slider betaLabel = qt.QLabel() betaLabel.text = "more Blobs <-> more Tubes" + SlicerVmtkCommonLib.Helper.CreateSpace( 16 ) betaLabel.setAlignment( 4 ) betaLabel.toolTip = "A higher value detects tubes rather than blobs." ioAdvancedFormLayout.addRow( betaLabel ) self.__betaSlider = ctk.ctkSliderWidget() self.__betaSlider.decimals = 1 self.__betaSlider.minimum = 0.1 self.__betaSlider.maximum = 500 self.__betaSlider.singleStep = 0.1 self.__betaSlider.toolTip = betaLabel.toolTip ioAdvancedFormLayout.addRow( self.__betaSlider ) # contrast slider contrastLabel = qt.QLabel() contrastLabel.text = "low Input Contrast <-> high Input Contrast" + SlicerVmtkCommonLib.Helper.CreateSpace( 14 ) contrastLabel.setAlignment( 4 ) contrastLabel.toolTip = "If the intensity contrast in the input image between vessel and background is high, choose a high value else choose a low value." ioAdvancedFormLayout.addRow( contrastLabel ) self.__contrastSlider = ctk.ctkSliderWidget() self.__contrastSlider.decimals = 0 self.__contrastSlider.minimum = 0 self.__contrastSlider.maximum = 500 self.__contrastSlider.singleStep = 10 self.__contrastSlider.toolTip = contrastLabel.toolTip ioAdvancedFormLayout.addRow( self.__contrastSlider ) # # Reset, preview and apply buttons # self.__buttonBox = qt.QDialogButtonBox() self.__resetButton = self.__buttonBox.addButton( self.__buttonBox.RestoreDefaults ) self.__resetButton.toolTip = "Click to reset all input elements to default." self.__previewButton = self.__buttonBox.addButton( self.__buttonBox.Discard ) self.__previewButton.setIcon( qt.QIcon() ) self.__previewButton.text = "Preview.." self.__previewButton.toolTip = "Click to refresh the preview." self.__startButton = self.__buttonBox.addButton( self.__buttonBox.Apply ) self.__startButton.setIcon( qt.QIcon() ) self.__startButton.text = "Start!" self.__startButton.enabled = False self.__startButton.toolTip = "Click to start the filtering." self.layout.addWidget( self.__buttonBox ) self.__resetButton.connect( "clicked()", self.restoreDefaults ) self.__previewButton.connect( "clicked()", self.onRefreshButtonClicked ) self.__startButton.connect( "clicked()", self.onStartButtonClicked ) # be ready for events self.__updating = 0 # set default values self.restoreDefaults() # compress the layout self.layout.addStretch( 1 )
def setup(self): # check if the SlicerVmtk4 module is installed properly #self.__vmtkInstalled = SlicerVmtk4CommonLib.Helper.CheckIfVmtkIsInstalled() #Helper.Debug("VMTK found: " + self.__vmtkInstalled) # # the I/O panel # ioCollapsibleButton = ctk.ctkCollapsibleButton() ioCollapsibleButton.text = "Input/Output" self.layout.addWidget(ioCollapsibleButton) ioFormLayout = qt.QFormLayout(ioCollapsibleButton) # inputVolume selector self.__inputModelNodeSelector = slicer.qMRMLNodeComboBox() self.__inputModelNodeSelector.objectName = 'inputModelNodeSelector' self.__inputModelNodeSelector.toolTip = "Select the input model." self.__inputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.__inputModelNodeSelector.hideChildNodeTypes = [ 'vtkMRMLAnnotationNode' ] # hide all annotation nodes self.__inputModelNodeSelector.noneEnabled = False self.__inputModelNodeSelector.addEnabled = False self.__inputModelNodeSelector.removeEnabled = False ioFormLayout.addRow("Input Model:", self.__inputModelNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__inputModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.__inputModelNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onInputModelChanged) # seed selector self.__seedFiducialsNodeSelector = slicer.qMRMLNodeComboBox() self.__seedFiducialsNodeSelector.objectName = 'seedFiducialsNodeSelector' self.__seedFiducialsNodeSelector.toolTip = "Select a fiducial to use as the origin of the Centerline." self.__seedFiducialsNodeSelector.nodeTypes = [ 'vtkMRMLAnnotationFiducialNode' ] self.__seedFiducialsNodeSelector.baseName = "OriginSeed" self.__seedFiducialsNodeSelector.noneEnabled = False self.__seedFiducialsNodeSelector.addEnabled = False self.__seedFiducialsNodeSelector.removeEnabled = False ioFormLayout.addRow("Start Point:", self.__seedFiducialsNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__seedFiducialsNodeSelector, 'setMRMLScene(vtkMRMLScene*)') self.__seedFiducialsNodeSelector.connect( 'currentNodeChanged(vtkMRMLNode*)', self.onSeedChanged) self.__ioAdvancedToggle = qt.QCheckBox("Show Advanced Properties") self.__ioAdvancedToggle.setChecked(False) ioFormLayout.addRow(self.__ioAdvancedToggle) # # I/O advanced panel # self.__ioAdvancedPanel = qt.QFrame(ioCollapsibleButton) self.__ioAdvancedPanel.hide() self.__ioAdvancedPanel.setFrameStyle(6) ioFormLayout.addRow(self.__ioAdvancedPanel) self.__ioAdvancedToggle.connect("clicked()", self.onIOAdvancedToggle) ioAdvancedFormLayout = qt.QFormLayout(self.__ioAdvancedPanel) # outputModel selector self.__outputModelNodeSelector = slicer.qMRMLNodeComboBox() self.__outputModelNodeSelector.objectName = 'outputModelNodeSelector' self.__outputModelNodeSelector.toolTip = "Select the output model for the Centerlines." self.__outputModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.__outputModelNodeSelector.baseName = "CenterlineComputationModel" self.__outputModelNodeSelector.hideChildNodeTypes = [ 'vtkMRMLAnnotationNode' ] # hide all annotation nodes self.__outputModelNodeSelector.noneEnabled = False self.__outputModelNodeSelector.addEnabled = True self.__outputModelNodeSelector.selectNodeUponCreation = True self.__outputModelNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow("Output Centerline Model:", self.__outputModelNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__outputModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # voronoiModel selector self.__voronoiModelNodeSelector = slicer.qMRMLNodeComboBox() self.__voronoiModelNodeSelector.objectName = 'voronoiModelNodeSelector' self.__voronoiModelNodeSelector.toolTip = "Select the output model for the Voronoi Diagram." self.__voronoiModelNodeSelector.nodeTypes = ['vtkMRMLModelNode'] self.__voronoiModelNodeSelector.baseName = "VoronoiModel" self.__voronoiModelNodeSelector.hideChildNodeTypes = [ 'vtkMRMLAnnotationNode' ] # hide all annotation nodes self.__voronoiModelNodeSelector.noneEnabled = False self.__voronoiModelNodeSelector.addEnabled = True self.__voronoiModelNodeSelector.selectNodeUponCreation = True self.__voronoiModelNodeSelector.removeEnabled = True ioAdvancedFormLayout.addRow("Output Voronoi Model:", self.__voronoiModelNodeSelector) self.parent.connect('mrmlSceneChanged(vtkMRMLScene*)', self.__voronoiModelNodeSelector, 'setMRMLScene(vtkMRMLScene*)') # # Reset, preview and apply buttons # self.__buttonBox = qt.QDialogButtonBox() self.__resetButton = self.__buttonBox.addButton( self.__buttonBox.RestoreDefaults) self.__resetButton.toolTip = "Click to reset all input elements to default." self.__previewButton = self.__buttonBox.addButton( self.__buttonBox.Discard) self.__previewButton.setIcon(qt.QIcon()) self.__previewButton.text = "Preview.." self.__previewButton.toolTip = "Click to refresh the preview." self.__startButton = self.__buttonBox.addButton(self.__buttonBox.Apply) self.__startButton.setIcon(qt.QIcon()) self.__startButton.text = "Start!" self.__startButton.enabled = False self.__startButton.toolTip = "Click to start the filtering." self.layout.addWidget(self.__buttonBox) self.__resetButton.connect("clicked()", self.restoreDefaults) self.__previewButton.connect("clicked()", self.onRefreshButtonClicked) self.__startButton.connect("clicked()", self.onStartButtonClicked) # be ready for events self.__updating = 0 # set default values self.restoreDefaults() # compress the layout self.layout.addStretch(1)