def setupIntraopSeriesSelector(self): self.intraopSeriesSelector = qt.QComboBox() self.intraopSeriesSelector.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum) self.intraopSeriesSelector.setMinimumContentsLength(20) self.intraopSeriesSelector.setSizeAdjustPolicy(qt.QComboBox().AdjustToMinimumContentsLength) self._seriesModel = qt.QStandardItemModel() self.intraopSeriesSelector.setModel(self._seriesModel)
def onMismatchErrorApply(self): print "apply button\n" myWLIO = self.logic.RunMismatchError(self.WLIO) self.averageError.setText(myWLIO.average) self.Variance.setText(myWLIO.variance) self.stDev.setText(myWLIO.stdev) print "ready to draw table:" for dist in myWLIO.landm_distance: print dist # the table.. - separate into a function? self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) self.view.verticalHeader().visible = False row = 0 landmarkcounter = 0 for dist in myWLIO.landm_distance: # 1st column (row,0) item = qt.QStandardItem() landmarkcounter += 1 item.setText(landmarkcounter) self.model.setItem(row, 0, item) self.items.append(item) # 2nd column (row,1) item = qt.QStandardItem() item.setText(dist) self.model.setItem(row, 1, item) self.items.append(item) row += 1 #done! #self.view.setColumnWidth(0,30) self.model.setHeaderData(0, 1, "Landmark") self.model.setHeaderData(1, 1, "dist, mm")
def populateColors(self): self.brushes = [] self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) pattern = self.search.text self.row = 0 for c in self.recents: self.addRow(c) if self.recents: item = qt.QStandardItem() item.setText("--") self.model.setItem(self.row, 0, item) self.model.setItem(self.row, 1, item) self.model.setItem(self.row, 2, item) self.items.append(item) self.row += 1 for c in range(self.colorNode.GetNumberOfColors()): name = self.colorNode.GetColorName(c) if name != "(none)" and name.lower().find(pattern.lower()) >= 0: self.addRow(c) self.view.setColumnWidth(0, 75) self.view.setColumnWidth(1, 50) self.view.setColumnWidth(2, 150) self.model.setHeaderData(0, 1, "Number") self.model.setHeaderData(1, 1, "Color") self.model.setHeaderData(2, 1, "Name")
def populateDistances(self): if not self.logic: return self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) self.view.verticalHeader().visible = False row = 0 for i in self.logic.landmarkPairs["Landmarks"]: item = qt.QStandardItem() item.setData(points[fixed]) #item.setToolTip(colorNode.GetColorName(i)) self.model.setItem(row, 0, item) self.items.append(item) col = 1 for k in self.logic.keys: item = qt.QStandardItem() item.setText(str(self.logic.landmarkPairs[i, k])) #item.setToolTip(colorNode.GetColorName(i)) self.model.setItem(row, col, item) self.items.append(item) col += 1 row += 1 self.view.setColumnWidth(0, 30) self.model.setHeaderData(0, 1, " ") col = 1 for k in self.logic.keys: self.view.setColumnWidth(col, 15 * len(k)) self.model.setHeaderData(col, 1, k) col += 1
def setupIntraopSeriesSelector(self): self.intraopSeriesSelector = qt.QComboBox() self.intraopSeriesSelector.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum) self._seriesModel = qt.QStandardItemModel() self.intraopSeriesSelector.setModel(self._seriesModel) self.intraopSeriesSelector.setToolTip( constants.IntraopSeriesSelectorToolTip)
def _createListView(self, name, headerLabels): view = qt.QListView() view.setObjectName(name) view.setSpacing(3) model = qt.QStandardItemModel() model.setHorizontalHeaderLabels(headerLabels) view.setModel(model) view.setEditTriggers(qt.QAbstractItemView.NoEditTriggers) return view, model
def _configureStudiesTable(self): self._studiesTable = self.ui.findChild(qt.QTableView, "studiesTableView") self._studiesTableModel = qt.QStandardItemModel() self._studiesTableModel.setHorizontalHeaderLabels( ["Study Instance UID", "Date"]) self._studiesTable.setModel(self._studiesTableModel) self._studiesTable.setEditTriggers(qt.QAbstractItemView.NoEditTriggers) self._studiesTable.horizontalHeader().setSectionResizeMode( 0, qt.QHeaderView.Stretch) self._studiesTable.horizontalHeader().setSectionResizeMode( 1, qt.QHeaderView.ResizeToContents)
def populateStats(self): if not self.logic: return displayNode = self.labelNode.GetDisplayNode() colorNode = displayNode.GetColorNode() lut = colorNode.GetLookupTable() self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) self.view.verticalHeader().visible = False row = 0 for i in self.logic.labelStats["Labels"]: col = 0 color = qt.QColor() rgb = lut.GetTableValue(i) color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) item = qt.QStandardItem() item.setData(color, qt.Qt.DecorationRole) item.setToolTip(colorNode.GetColorName(i)) item.setEditable(False) self.model.setItem(row, col, item) self.items.append(item) col += 1 item = qt.QStandardItem() item.setData(colorNode.GetColorName(i), qt.Qt.DisplayRole) item.setEditable(False) self.model.setItem(row, col, item) self.items.append(item) col += 1 for k in self.logic.keys: item = qt.QStandardItem() # set data as float with Qt::DisplayRole item.setData(float(self.logic.labelStats[i, k]), qt.Qt.DisplayRole) item.setToolTip(colorNode.GetColorName(i)) item.setEditable(False) self.model.setItem(row, col, item) self.items.append(item) col += 1 row += 1 self.view.setColumnWidth(0, 30) self.model.setHeaderData(0, 1, " ") self.model.setHeaderData(1, 1, "Type") col = 2 for k in self.logic.keys: self.view.setColumnWidth(col, 15 * len(k)) self.model.setHeaderData(col, 1, k) col += 1
def __init__(self, columnNames): super().__init__() self.addButton = qt.QPushButton('+') self.addButton.clicked.connect(self.onAddButton) self.removeButton = qt.QPushButton('-') self.removeButton.clicked.connect(self.onRemoveButton) self.linkStagesPushButton = qt.QPushButton('Link Across Stages') self.linkStagesPushButton.toolTip = 'When checked, settings will be the same for all stages.' self.linkStagesPushButton.checkable = True self.buttonsFrame = qt.QFrame() self.buttonsFrame.setSizePolicy(qt.QSizePolicy.Preferred, qt.QSizePolicy.Minimum) self.buttonsFrame.setLayout(qt.QHBoxLayout()) self.buttonsFrame.layout().addWidget(self.addButton) self.buttonsFrame.layout().addWidget(self.removeButton) self.buttonsFrame.layout().addWidget(self.linkStagesPushButton) self.model = qt.QStandardItemModel(1, len(columnNames)) for i, columnName in enumerate(columnNames): self.model.setHeaderData(i, qt.Qt.Horizontal, columnName) self.view = qt.QTableView() self.view.setEditTriggers(self.view.CurrentChanged + self.view.DoubleClicked + self.view.SelectedClicked) self.view.setSelectionMode(self.view.SingleSelection) self.view.setSelectionBehavior(self.view.SelectRows) self.view.horizontalHeader().setStretchLastSection(True) self.view.setHorizontalScrollMode(self.view.ScrollPerPixel) self.view.verticalHeader().setMaximumSectionSize(self.RowHeight) self.view.verticalHeader().setMinimumSectionSize(self.RowHeight) self.view.verticalHeader().setDefaultSectionSize(self.RowHeight) self.view.setFixedHeight(65) self.view.setModel(self.model) self.view.setCurrentIndex(self.model.index(0, 0)) self.view.selectionModel().selectionChanged.connect( self.onSelectionChanged) layout = qt.QVBoxLayout(self) layout.addWidget(self.buttonsFrame) layout.addWidget(self.view) return layout
def PopulateTableStats(self): """ Creates the Qt table with the statistics""" NewOrderKeys = [ 'Segment', 'Scalar Volume', 'Mean', 'Standard Deviation', 'Minimum', 'Maximum', 'Median', 'Number of voxels [voxels]', 'Surface area [mm2]', 'Volume [mm3]', 'Volume [mm3]' ] self.items = [] self.model = qt.QStandardItemModel() self.table.setModel(self.model) self.table.verticalHeader().visible = False segmentationNode = self.segmentationSelector.currentNode() row = 0 NofSegments = len(self.statistics['SegmentIDs']) I = np.concatenate((np.arange(NofSegments), np.arange(NofSegments))) for i in range(len(list(self.stats.values())[0])): col = 0 color = qt.QColor() segment = segmentationNode.GetSegmentation().GetSegment( self.statistics['SegmentIDs'][I[i]]) rgb = segment.GetColor() color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) item = qt.QStandardItem() item.setData(color, qt.Qt.DecorationRole) item.setEditable(False) self.model.setItem(row, col, item) self.items.append(item) col += 1 for k in NewOrderKeys: item = qt.QStandardItem() item.setData(self.stats[k][i], qt.Qt.DisplayRole) item.setEditable(False) self.model.setItem(row, col, item) self.items.append(item) col += 1 row += 1 col = 0 self.table.setColumnWidth(0, 30) self.model.setHeaderData(0, 1, " ") col += 1 for k in NewOrderKeys: self.table.setColumnWidth(col, 16 * len(k)) self.model.setHeaderData(col, 1, k) col += 1
def populateStats(self): if not self.logic: return displayNode = self.labelNode.GetDisplayNode() colorNode = displayNode.GetColorNode() lut = colorNode.GetLookupTable() self.items = [] self.model = qt.QStandardItemModel() self.view.setModel(self.model) self.view.verticalHeader().visible = False row = 0 for regionTag, regionValue in zip(self.logic.regionTags, self.logic.regionValues): color = qt.QColor() rgb = lut.GetTableValue(regionValue[0]) color.setRgb(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) item = qt.QStandardItem() item.setData(color, 1) item.setText(str(regionTag)) item.setData(regionTag, 1) item.setToolTip(regionTag) item.setTextAlignment(1) self.model.setItem(row, 0, item) self.items.append(item) col = 1 for k in self.logic.keys: item = qt.QStandardItem() item.setText("%.3f" % self.logic.labelStats[k, regionTag]) item.setTextAlignment(4) self.view.setColumnWidth(col, 15 * len(item.text())) self.model.setItem(row, col, item) self.items.append(item) col += 1 row += 1 self.view.setColumnWidth(0, 15 * len('Region')) self.model.setHeaderData(0, 1, "Region") col = 1 for k in self.logic.keys: # self.view.setColumnWidth(col,15*len(k)) self.model.setHeaderData(col, 1, k) col += 1
def _configureSeriesTable(self): self._seriesTable = self.ui.findChild(qt.QTableView, "seriesTableView") self._seriesTableModel = qt.QStandardItemModel() self._seriesTableModel.setHorizontalHeaderLabels([ "UID", "Series Number", "Series Date", "Modality", "Series Description" ]) self._seriesTable.setModel(self._seriesTableModel) self._seriesTable.setEditTriggers(qt.QAbstractItemView.NoEditTriggers) self._seriesTable.setColumnHidden(0, True) # self._seriesTable.horizontalHeader().setSectionResizeMode(0, qt.QHeaderView.Stretch) self._seriesTable.horizontalHeader().setSectionResizeMode( 1, qt.QHeaderView.ResizeToContents) self._seriesTable.horizontalHeader().setSectionResizeMode( 2, qt.QHeaderView.ResizeToContents) self._seriesTable.horizontalHeader().setSectionResizeMode( 3, qt.QHeaderView.ResizeToContents) self._seriesTable.horizontalHeader().setSectionResizeMode( 4, qt.QHeaderView.Stretch) self._seriesTable.setSelectionBehavior(qt.QTableView.SelectRows) self._seriesTable.verticalHeader().hide()
def __init__(self, *args, **kwargs): qt.QWidget.__init__(self, *args, **kwargs) self.create() # mrml volume node instances self._master = None self._merge = None # pseudo signals # - python callable that gets True or False self.mergeValidCommand = None # string self.mergeVolumePostfix = "-label" # instance of a ColorBox self.colorBox = None # qt model/view classes to track per-structure volumes self.structures = qt.QStandardItemModel() # mrml node for invoking command line modules self.CLINode = None # slicer helper class self.volumesLogic = slicer.modules.volumes.logic() # buttons pressed self.addStructureButton.connect("clicked()", self.addStructure) self.deleteStructuresButton.connect("clicked()", self.deleteStructures) self.deleteSelectedStructureButton.connect( "clicked()", self.deleteSelectedStructure) # selection changed event # invoked event self.splitButton.connect("clicked()", self.split) self.mergeButton.connect("clicked()", self.mergeStructures) self.mergeAndBuildButton.connect("clicked()", self.onMergeAndBuild) self.exportButton.connect("clicked()", self.export)
def setup(self): ScriptedLoadableModuleWidget.setup(self) # Instantiate and connect widgets ... # # Input/Export Area # IOCollapsibleButton = ctk.ctkCollapsibleButton() IOCollapsibleButton.text = "Input and Export" self.layout.addWidget(IOCollapsibleButton) # Layout within the dummy collapsible button #IOFormLayout = qt.QFormLayout(IOCollapsibleButton) IOFormLayout = qt.QFormLayout(IOCollapsibleButton) # # Username input # self.userNameInput = qt.QLineEdit() self.userNameInput.setText(slicer.userNameDefault) self.userNameInput.setToolTip("Input MorphoSource account username") IOFormLayout.addRow("MorphSource Username: "******"Input MorphoSource account password") IOFormLayout.addRow("MorphSource Password: "******"Log in") self.loginButton.toolTip = "Log into the Morphosource database" self.loginButton.enabled = False IOFormLayout.addRow(self.loginButton) # # Query parameter area # parametersCollapsibleButton = ctk.ctkCollapsibleButton() parametersCollapsibleButton.text = "Query parameters" self.layout.addWidget(parametersCollapsibleButton) # Layout within the dummy collapsible button parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton) # # Username input # self.orderInput = qt.QLineEdit() self.orderInput.setToolTip( "Input the the specimen order, eg: 'Euprimates' ") parametersFormLayout.addRow("Query order: ", self.orderInput) # # Username input # self.elementInput = qt.QLineEdit() self.elementInput.setToolTip( "Input the speciment element, eg: 'Cranuim' ") parametersFormLayout.addRow("Query element: ", self.elementInput) # # Submit query Button # self.submitQueryButton = qt.QPushButton("Submit query") self.submitQueryButton.toolTip = "Query the MorphoSource database for 3D models. This may take a few minutes." self.submitQueryButton.enabled = False parametersFormLayout.addRow(self.submitQueryButton) # # Query results area # resultsCollapsibleButton = ctk.ctkCollapsibleButton() resultsCollapsibleButton.text = "Query results:" resultsCollapsibleButton.collapsed = False self.layout.addWidget(resultsCollapsibleButton) resultsFormLayout = qt.QFormLayout(resultsCollapsibleButton) self.resultsModel = qt.QStandardItemModel() self.resultsTable = qt.QTableView() self.resultsTable.horizontalHeader().stretchLastSection = True self.resultsTable.horizontalHeader().visible = False self.resultsTable.verticalHeader().visible = False self.resultsTable.setSelectionBehavior( qt.QAbstractItemView().SelectRows) self.resultsTable.setModel(self.resultsModel) resultsFormLayout.addRow(self.resultsTable) self.loadResultsButton = qt.QPushButton("Load selected models") self.loadResultsButton.toolTip = "Load the selected models into the scene." self.loadResultsButton.enabled = False resultsFormLayout.addRow(self.loadResultsButton) # connections self.loginButton.connect('clicked(bool)', self.onLogin) self.userNameInput.connect('textChanged(const QString &)', self.onLoginStringChanged) self.passwordInput.connect('textChanged(const QString &)', self.onLoginStringChanged) self.orderInput.connect('textChanged(const QString &)', self.onQueryStringChanged) self.elementInput.connect('textChanged(const QString &)', self.onQueryStringChanged) self.submitQueryButton.connect('clicked(bool)', self.onSubmitQuery) self.loadResultsButton.connect('clicked(bool)', self.onLoadResults) # Add vertical spacer self.layout.addStretch(1) # Refresh Apply button state self.onLoginStringChanged() self.onQueryStringChanged()
def updateStructures(self, caller=None, event=None): """re-build the Structures frame - optional caller and event ignored (for use as vtk observer callback) """ if slicer.mrmlScene.IsBatchProcessing(): return if self.mergeButton.destroyed(): """ TODO: here the python class still exists but the Qt widgets are gone - need to figure out when to remove observers and free python code - probably the destroyed() signal. """ self.cleanup() return #self.mergeSelector.setDisabled(not self.master) # reset to a fresh model self.structures = qt.QStandardItemModel() self.structuresView.setModel(self.structures) # if no merge volume exists, disable everything - else enable merge = self.merge self.addStructureButton.setDisabled(not merge) self.deleteStructuresButton.setDisabled(not merge) self.deleteSelectedStructureButton.setDisabled(not merge) self.mergeButton.setDisabled(not merge) self.splitButton.setDisabled(not merge) self.mergeAndBuildButton.setDisabled(not merge) self.replaceModels.setDisabled(not merge) if self.mergeValidCommand: # will be passed current self.mergeValidCommand(merge) if not merge: return colorNode = merge.GetDisplayNode().GetColorNode() lut = colorNode.GetLookupTable() masterName = self.master.GetName() volumeNodes = self.structureVolumes() for vNode in volumeNodes: vName = vNode.GetName() # figure out what name it is # - account for the fact that sometimes a number will be added to the end of the name start = 1 + len(masterName) end = vName.rfind(self.mergeVolumePostfix) structureName = vName[start:end] structureIndex = colorNode.GetColorIndexByName(structureName) structureColor = lut.GetTableValue(structureIndex)[0:3] color = qt.QColor() color.setRgb(structureColor[0] * 255, structureColor[1] * 255, structureColor[2] * 255) # label index item = qt.QStandardItem() item.setEditable(False) item.setText("%03d" % int(structureIndex)) self.structures.setItem(self.row, 0, item) # label color item = qt.QStandardItem() item.setEditable(False) item.setData(color, 1) self.structures.setItem(self.row, 1, item) # structure name item = qt.QStandardItem() item.setEditable(False) item.setText(structureName) self.structures.setItem(self.row, 2, item) # volumeName name item = qt.QStandardItem() item.setEditable(False) item.setText(vName) self.structures.setItem(self.row, 3, item) # sort order item = qt.QStandardItem() item.setEditable(True) item.setText("") self.structures.setItem(self.row, 4, item) self.row += 1 for i in range(5): self.structuresView.resizeColumnToContents(i) self.structures.setHeaderData(0, 1, "Number") self.structures.setHeaderData(1, 1, "Color") self.structures.setHeaderData(2, 1, "Name") self.structures.setHeaderData(3, 1, "Label Volume") self.structures.setHeaderData(4, 1, "Order") self.structuresView.setModel(self.structures) self.structuresView.connect("activated(QModelIndex)", self.onStructuresClicked) self.structuresView.setProperty( 'SH_ItemView_ActivateItemOnSingleClick', 1) self.structureLabelNames = [] rows = self.structures.rowCount() for row in xrange(rows): self.structureLabelNames.append( self.structures.item(row, 2).text())
def setup(self): ScriptedLoadableModuleWidget.setup(self) # Instantiate and connect widgets ... # # File area # filesCollapsibleButton = ctk.ctkCollapsibleButton() filesCollapsibleButton.text = "Files" filesCollapsibleButton.collapsed = False self.layout.addWidget(filesCollapsibleButton) # Layout within the files collapsible button filesFormLayout = qt.QFormLayout(filesCollapsibleButton) self.fileModel = qt.QStandardItemModel() self.fileTable = qt.QTableView() self.fileTable.horizontalHeader().stretchLastSection = True self.fileTable.horizontalHeader().visible = False self.fileTable.setModel(self.fileModel) filesFormLayout.addRow(self.fileTable) buttonLayout = qt.QHBoxLayout() self.addByBrowsingButton = qt.QPushButton("Browse for files") self.clearFilesButton = qt.QPushButton("Clear files") buttonLayout.addWidget(self.addByBrowsingButton) buttonLayout.addWidget(self.clearFilesButton) filesFormLayout.addRow(buttonLayout) # # output area # outputCollapsibleButton = ctk.ctkCollapsibleButton() outputCollapsibleButton.text = "Output" outputCollapsibleButton.collapsed = False self.layout.addWidget(outputCollapsibleButton) outputFormLayout = qt.QFormLayout(outputCollapsibleButton) # # output volume selector # #self.outputSelector = slicer.qMRMLSubjectHierarchyComboBox() self.outputSelector = slicer.qMRMLNodeComboBox() self.outputSelector.nodeTypes = ["vtkMRMLScalarVolumeNode",] #self.outputSelector.setNodeTypes(["vtkMRMLScalarVolumeNode",]) ; TODO: make nodeTypes property for SH box """ TODO: which are supported and needed for SubjectHierarchy combo box. TODO: can we delete/rename/create as with SH self.outputSelector.defaultText = "Create new volume." ; # TODO any way to reset value? """ self.outputSelector.showChildNodeTypes = False self.outputSelector.showHidden = False self.outputSelector.showChildNodeTypes = False self.outputSelector.selectNodeUponCreation = False self.outputSelector.noneEnabled = True self.outputSelector.removeEnabled = True self.outputSelector.renameEnabled = True self.outputSelector.addEnabled = True self.outputSelector.setMRMLScene( slicer.mrmlScene ) self.outputSelector.setToolTip( "Pick the output volume to populate or None to autogenerate." ) outputFormLayout.addRow("Output Volume: ", self.outputSelector) self.spacing = ctk.ctkCoordinatesWidget() self.spacing.coordinates = "1,1,1" self.spacing.toolTip = "Set the colunm, row, slice spacing in mm" outputFormLayout.addRow("Spacing: ", self.spacing) self.loadButton = qt.QPushButton("Load files") outputFormLayout.addRow(self.loadButton) # # Add by name area # addByNameCollapsibleButton = ctk.ctkCollapsibleButton() addByNameCollapsibleButton.text = "Add files by name" addByNameCollapsibleButton.collapsed = True addByNameFormLayout = qt.QFormLayout(addByNameCollapsibleButton) # Don't enable Add by name for now - let's see if it's actually needed # self.layout.addWidget(addByNameCollapsibleButton) forExample = """ directoryPath = '/Volumes/SSD2T/data/SlicerMorph/Sample_for_steve/1326_Rec' pathFormat = '%s/1326__rec%04d.png' start, end = (50, 621) """ self.archetypePathEdit = ctk.ctkPathLineEdit() addByNameFormLayout.addRow("Archetype file", self.archetypePathEdit) self.archetypeFormat = qt.QLineEdit() addByNameFormLayout.addRow("Name format", self.archetypeFormat) self.indexRange = ctk.ctkRangeWidget() self.indexRange.decimals = 0 self.indexRange.maximum = 0 addByNameFormLayout.addRow("Index range", self.indexRange) self.generateNamesButton = qt.QPushButton("Apply") self.generateNamesButton.toolTip = "Run the algorithm." self.generateNamesButton.enabled = False addByNameFormLayout.addRow(self.generateNamesButton) # connections self.addByBrowsingButton.connect('clicked()', self.addByBrowsing) self.clearFilesButton.connect('clicked()', self.fileTable.model().clear) self.archetypePathEdit.connect('currentPathChanged(QString)', self.validateInput) self.archetypePathEdit.connect('currentPathChanged(QString)', self.updateGUIFromArchetype) self.archetypeFormat.connect('textChanged(QString)', self.validateInput) self.generateNamesButton.connect('clicked()', self.onGenerateNames) # self.outputSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.validateInput) # TODO - this is missing self.loadButton.connect('clicked()', self.onLoadButton) # refill last selection self.archetypePathEdit.currentPath = slicer.util.settingsValue("ImageStacks/lastArchetypePath", "") # Add vertical spacer self.layout.addStretch(1) # Refresh Apply button state self.validateInput()
def setup(self): ScriptedLoadableModuleWidget.setup(self) # Instantiate and connect widgets ... # # File area # filesCollapsibleButton = ctk.ctkCollapsibleButton() filesCollapsibleButton.text = "Files" filesCollapsibleButton.collapsed = False self.layout.addWidget(filesCollapsibleButton) # Layout within the files collapsible button filesFormLayout = qt.QFormLayout(filesCollapsibleButton) self.fileModel = qt.QStandardItemModel() self.fileTable = qt.QTableView() self.fileTable.horizontalHeader().stretchLastSection = True self.fileTable.horizontalHeader().visible = False self.fileTable.setModel(self.fileModel) filesFormLayout.addRow(self.fileTable) buttonLayout = qt.QHBoxLayout() self.addByBrowsingButton = qt.QPushButton("Browse for files") self.clearFilesButton = qt.QPushButton("Clear files") buttonLayout.addWidget(self.addByBrowsingButton) buttonLayout.addWidget(self.clearFilesButton) filesFormLayout.addRow(buttonLayout) self.propertiesLabel = qt.QLabel() filesFormLayout.addRow(self.propertiesLabel) # # output area # outputCollapsibleButton = ctk.ctkCollapsibleButton() outputCollapsibleButton.text = "Output" outputCollapsibleButton.collapsed = False self.layout.addWidget(outputCollapsibleButton) outputFormLayout = qt.QFormLayout(outputCollapsibleButton) # # output volume selector # self.outputSelector = slicer.qMRMLNodeComboBox() self.outputSelector.nodeTypes = [ "vtkMRMLScalarVolumeNode", ] self.outputSelector.showChildNodeTypes = False self.outputSelector.showHidden = False self.outputSelector.showChildNodeTypes = False self.outputSelector.selectNodeUponCreation = True self.outputSelector.noneEnabled = True self.outputSelector.removeEnabled = True self.outputSelector.renameEnabled = True self.outputSelector.addEnabled = True self.outputSelector.setMRMLScene(slicer.mrmlScene) self.outputSelector.setToolTip( "Pick the output volume to populate or None to autogenerate.") outputFormLayout.addRow("Output Volume: ", self.outputSelector) self.spacing = ctk.ctkCoordinatesWidget() self.spacing.decimals = 8 self.spacing.coordinates = "1,1,1" self.spacing.toolTip = "Set the colunm, row, slice spacing in mm; original spacing not including downsample" outputFormLayout.addRow("Spacing: ", self.spacing) self.downsample = qt.QCheckBox() self.downsample.toolTip = "Reduces data size by half in each dimension by skipping every other pixel and slice (uses about 1/8 memory)" outputFormLayout.addRow("Downsample: ", self.downsample) self.reverse = qt.QCheckBox() self.reverse.toolTip = "Read the images in reverse order" outputFormLayout.addRow("Reverse: ", self.reverse) self.sliceSkip = ctk.ctkDoubleSpinBox() self.sliceSkip.decimals = 0 self.sliceSkip.minimum = 0 self.sliceSkip.toolTip = "Skips the selected number of slices (use, for example, on long thin samples with more slices than in-plane resolution)" outputFormLayout.addRow("Slice skip: ", self.sliceSkip) self.loadButton = qt.QPushButton("Load files") outputFormLayout.addRow(self.loadButton) # # Add by name area # addByNameCollapsibleButton = ctk.ctkCollapsibleButton() addByNameCollapsibleButton.text = "Add files by name" addByNameCollapsibleButton.collapsed = True addByNameFormLayout = qt.QFormLayout(addByNameCollapsibleButton) # Don't enable Add by name for now - let's see if it's actually needed # self.layout.addWidget(addByNameCollapsibleButton) forExample = """ directoryPath = '/Volumes/SSD2T/data/SlicerMorph/Sample_for_steve/1326_Rec' pathFormat = '%s/1326__rec%04d.png' start, end = (50, 621) """ self.archetypePathEdit = ctk.ctkPathLineEdit() addByNameFormLayout.addRow("Archetype file", self.archetypePathEdit) self.archetypeFormat = qt.QLineEdit() addByNameFormLayout.addRow("Name format", self.archetypeFormat) self.indexRange = ctk.ctkRangeWidget() self.indexRange.decimals = 0 self.indexRange.maximum = 0 addByNameFormLayout.addRow("Index range", self.indexRange) self.generateNamesButton = qt.QPushButton("Apply") self.generateNamesButton.toolTip = "Run the algorithm." self.generateNamesButton.enabled = False addByNameFormLayout.addRow(self.generateNamesButton) # connections self.addByBrowsingButton.connect('clicked()', self.addByBrowsing) self.clearFilesButton.connect('clicked()', self.onClearFiles) self.archetypePathEdit.connect('currentPathChanged(QString)', self.validateInput) self.archetypePathEdit.connect('currentPathChanged(QString)', self.updateGUIFromArchetype) self.archetypeFormat.connect('textChanged(QString)', self.validateInput) self.generateNamesButton.connect('clicked()', self.onGenerateNames) # self.outputSelector.connect("currentNodeChanged(vtkMRMLNode*)", self.validateInput) # TODO - this is missing self.loadButton.connect('clicked()', self.onLoadButton) # refill last selection self.archetypePathEdit.currentPath = slicer.util.settingsValue( "ImageStacks/lastArchetypePath", "") # Add vertical spacer self.layout.addStretch(1) # Refresh Apply button state self.validateInput()
"""Create and execute an explorer dialog.""" dialog = ExplorerDialog(widget) dialog.exec_() if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('class_name', help='Create a widget of this class to explore.') parser.add_argument('--model', metavar='COLUMNS', type=int, help='Create a model for the widget.') args = parser.parse_args() app = qt.QApplication([]) w = getattr(qt, args.class_name)() if args.model: model = qt.QStandardItemModel(0, args.model) for s in ['foo', 'bar', 'baz']: row = [ qt.QStandardItem(c) for c in [s] + list(map(str, range(args.model - 1))) ] model.appendRow(row) print(w, model) w.setModel(model) explore(w)
def createSmall(self): """Make the internals of the widget to display in the Data Probe frame (lower left of slicer main window by default)""" # top row - things about the viewer itself self.viewerFrame = qt.QFrame(self.frame) self.viewerFrame.setLayout(qt.QHBoxLayout()) self.frame.layout().addWidget(self.viewerFrame) self.viewerColor = qt.QLabel(self.viewerFrame) self.viewerFrame.layout().addWidget(self.viewerColor) self.viewerName = qt.QLabel(self.viewerFrame) self.viewerFrame.layout().addWidget(self.viewerName) self.viewerRAS = qt.QLabel() self.viewerFrame.layout().addWidget(self.viewerRAS) self.viewerOrient = qt.QLabel() self.viewerFrame.layout().addWidget(self.viewerOrient) self.viewerSpacing = qt.QLabel() self.viewerFrame.layout().addWidget(self.viewerSpacing) self.viewerFrame.layout().addStretch(1) # the grid - things about the layers if True: # this method makes labels self.layerGrid = qt.QFrame(self.frame) self.layerGrid.setLayout(qt.QGridLayout()) self.frame.layout().addWidget(self.layerGrid) layers = ('L', 'F', 'B') self.layerNames = {} self.layerIJKs = {} self.layerValues = {} row = 0 for layer in layers: col = 0 self.layerGrid.layout().addWidget(qt.QLabel(layer), row, col) col += 1 self.layerNames[layer] = qt.QLabel() self.layerGrid.layout().addWidget(self.layerNames[layer], row, col) col += 1 self.layerIJKs[layer] = qt.QLabel() self.layerGrid.layout().addWidget(self.layerIJKs[layer], row, col) col += 1 self.layerValues[layer] = qt.QLabel() self.layerGrid.layout().addWidget(self.layerValues[layer], row, col) self.layerGrid.layout().setColumnStretch(col, 100) col += 1 row += 1 else: # this method use a model/view self.layerView = qt.QTableView(self.frame) self.layerView.verticalHeader().hide() self.frame.layout().addWidget(self.layerView) self.layerModel = qt.QStandardItemModel() self.layerView.setModel(self.layerModel) layers = ('L', 'F', 'B') self.layerNames = {} self.layerIJKs = {} self.layerValues = {} self.items = [] row = 0 for layer in layers: col = 0 item = qt.QStandardItem() item.setText(layer) self.layerModel.setItem(row, col, item) self.items.append(item) col += 1 self.layerNames[layer] = qt.QStandardItem() self.layerModel.setItem(row, col, self.layerNames[layer]) col += 1 self.layerIJKs[layer] = qt.QStandardItem() self.layerModel.setItem(row, col, self.layerIJKs[layer]) col += 1 self.layerValues[layer] = qt.QStandardItem() self.layerModel.setItem(row, col, self.layerValues[layer]) col += 1 row += 1 self.layerView.setColumnWidth(0, 15) self.layerView.setColumnWidth(1, 80) self.layerView.setColumnWidth(2, 65) self.layerView.setColumnWidth(3, 55) self.layerModel.setHeaderData(0, 1, "") self.layerModel.setHeaderData(1, 1, "Volume") self.layerModel.setHeaderData(2, 1, "IJK") self.layerModel.setHeaderData(3, 1, "Value") # goto module button self.goToModule = qt.QPushButton('->', self.frame) self.goToModule.setToolTip( 'Go to the DataProbe module for more information and options') self.frame.layout().addWidget(self.goToModule) self.goToModule.connect("clicked()", self.onGoToModule) # hide this for now - there's not much to see in the module itself self.goToModule.hide()