def delayDisplay(self, message, msec=1000): """This utility method displays a small dialog and waits. This does two things: 1) it lets the event loop catch up to the state of the test so that rendering and widget updates have all taken place before the test continues and 2) it shows the user/developer/tester the state of the test so that we'll know when it breaks. """ print(message) self.info = qt.QDialog() self.infoLayout = qt.QVBoxLayout() self.info.setLayout(self.infoLayout) self.label = qt.QLabel(message, self.info) self.infoLayout.addWidget(self.label) qt.QTimer.singleShot(msec, self.info.close) self.info.exec_()
def setup(self): self.clp, self.formLayout, self.formFrame = self.createClp( 'Warp Contour', self.layout, qt.QVBoxLayout()) # Objects to hold the widgets self.labels = {} self.buttons = {} # Paths self.topFolder = topFolder self.cmtkPath = os.path.realpath(os.path.join(self.topFolder, r'Tools/CMTK-2.3.0-Windows-x86/bin')) self.bashPath = os.path.realpath(os.path.join(self.topFolder, r'Tools/cmder/vendor/git-for-windows/bin/bash.exe')) config = [ ['lCnt', 'sCnt', 'findF1', 'file', '1. The contour (for in_3d) file'], ['lTfm', 'sTfm', 'findF2', 'file', '2. (in_3d)_to_(ex_xd).tfm'], ['lWrp', 'sWrp', 'findF3', 'folder', '3. The warp_output_transform folder'], ['lEx3', 'sEx3', 'findF4', 'file', '4. ex_3d_cropped.nii'], ['lCmt', 'sCmt', 'findF5', 'folder', '5. CMTK path'], ['lOut', 'sOut', 'findF6', 'folder', '6. Output folder'] ] # Create widgets for (lab1, lab2, labBtn, _type, desc) in config: self.labels[lab1] = self.createLabel(desc, self.formFrame.layout(), desc) self.labels[lab2] = self.createLabel("", self.formFrame.layout(), desc) self.buttons[labBtn] = self.createBtn('Locate / Change', self.findFileFact(lab2, _type), self.formFrame.layout()) # Set the default CMTK path self.labels['sCmt'].text = self.cmtkPath # Apply button self.labels['lApp'] = self.createLabel('7. Apply', self.formFrame.layout(), 'Apply') self.buttons['apply'] = self.createBtn('Apply', self.warpCnt, self.formFrame.layout())
def __init__(self, parent=0, optionsFrame=None, embedded=False, suppliedEffects=[]): self.effects = [] self.effectButtons = {} self.effectMapper = qt.QSignalMapper() self.effectMapper.connect('mapped(const QString&)', self.selectEffect) self.editUtil = EditUtil.EditUtil() # check for extensions - if none have been registered, just create the empty dictionary try: slicer.modules.editorExtensions except AttributeError: slicer.modules.editorExtensions = {} # embedded boolean specifies whether or not this edit box is to be embedded # into another moduleWidget # - if it is, all effect buttons will be displayed in a single row self.embedded = embedded # save the list of supplied effects that the caller wants to use # (should be a subset of EditBox.availableMouseTools + EditBox.availableOperations) self.suppliedEffects = suppliedEffects if parent == 0: self.parent = qt.QFrame() self.parent.setLayout(qt.QVBoxLayout()) self.create() self.parent.show() else: self.parent = parent self.create() # frame that holds widgets specific for each effect if not optionsFrame: self.optionsFrame = qt.QFrame(self.parent) else: self.optionsFrame = optionsFrame # state variables for selected effect in the box # - currentOption is an instance of an option GUI # - currentTools is a list of EffectTool instances self.currentOption = None self.currentTools = []
def __init__(self, parent=None): # To avoid the overhead of importing SimpleITK during application # startup, the import of SimpleITK is delayed until it is needed. global sitk import SimpleITK as sitk global sitkUtils import sitkUtils if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) else: self.parent = parent self.layout = self.parent.layout() if not parent: self.setup() self.parent.show() jsonFiles = glob(SimpleFilters.JSON_DIR + "*.json") jsonFiles.sort(key=lambda x: os.path.basename(x)) self.jsonFilters = [] for fname in jsonFiles: try: with open(fname, "r") as fp: j = json.load(fp, object_pairs_hook=OrderedDict) if j["name"] in dir(sitk): self.jsonFilters.append(j) else: if j["itk_module"] in sitk.Version().ITKModulesEnabled( ): import sys sys.stderr.write( "Unknown SimpleITK class \"{0}\".\n".format( j["name"])) except Exception as e: import sys sys.stderr.write( "Error while reading \"{0}\". Exception: {1}\n".format( fname, e)) self.filterParameters = None self.logic = None
def __init__(self, parent = None): # Get module name by stripping 'Widget' from the class name self.moduleName = self.__class__.__name__ if self.moduleName.endswith('Widget'): self.moduleName = self.moduleName[:-6] settings = qt.QSettings() self.developerMode = settings.value('Developer/DeveloperMode').lower() == 'true' if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) else: self.parent = parent self.layout = self.parent.layout() if not parent: self.setup() self.parent.show()
def __init__(self, parent=None): if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) else: self.parent = parent self.logic = None self.grayscaleNode = None self.labelNode = None self.fileName = None self.fileDialog = None if not parent: self.setup() self.grayscaleSelector.setMRMLScene(slicer.mrmlScene) self.labelSelector.setMRMLScene(slicer.mrmlScene) self.parent.show()
def setup(self): """This is called one time when the module GUI is initialized """ ScriptedLoadableModuleWidget.setup(self) # Just create a container for the widget mainAreaCollapsibleButton = ctk.ctkCollapsibleButton() mainAreaCollapsibleButton.text = "Main parameters" self.layout.addWidget(mainAreaCollapsibleButton) self.mainAreaLayout = qt.QVBoxLayout(mainAreaCollapsibleButton) # self.viewer = MIPViewerWidget(mainAreaCollapsibleButton) self.viewer = MIPViewerWidget(mainAreaCollapsibleButton, MIPViewerWidget.CONTEXT_UNKNOWN) self.viewer.setup() # self.viewer.activateEnhacedVisualization(True) self.layout.addStretch(1)
def __init__(self, parent=None): if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) else: self.parent = parent self.layout = self.parent.layout() if not parent: self.setup() self.parent.show() if slicer.mrmlScene.GetTagByClassName( "vtkMRMLScriptedModuleNode") != 'ScriptedModule': slicer.mrmlScene.RegisterNodeClass(vtkMRMLScriptedModuleNode())
def __init__(self, moduleName, columnNames, parentWidget = None, filePreffix=""): """Widget constructor (existing module)""" EventsTrigger.__init__(self) if not parentWidget: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) else: self.parent = parentWidget self.layout = self.parent.layout() self.__showWarningWhenIncompleteColumns__ = True self.logic = CaseReportsLogic(moduleName, columnNames, filePreffix) self.__initEvents__() self.reportWindow = CaseReportsWindow(self) self.reportWindow.objectName = "caseReportsWindow"
def __init__(self, parent=None): #constructor if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) else: self.parent = parent self.layout = self.parent.layout() if not parent: self.setup() self.parent.show() self.logic = ParsePathJsonLogic() self.verbose = True self.idxMask = None self.advancedOptions = None
def __init__(self, parent=None): try: #Load Test Cases imageFile = 'C:\\Users\\Vivek Narayan\\Desktop\\Breast DCE-MRI\\TestPatient1\\StudyDate1\\Reconstructions\\Pre.nrrd' labelFile = 'C:\\Users\\Vivek Narayan\\Desktop\\Breast DCE-MRI\\TestPatient1\\StudyDate1\\Segmentations\\Pre_labelMap.nrrd' properties = {} properties['labelmap'] = True imageLoad = list(slicer.util.loadVolume(imageFile, returnNode=True)) labelLoad = list( slicer.util.loadVolume(labelFile, properties, returnNode=True)) except: pass self.selImageNode = None # Currently selected image node for feature extraction self.selLabelNode = None # Currently selected label node for feature extraction self.fileDialog = None # Data of database self.mainPatientdir = '' self.DBpatientNames = [] self.DatabaseHierarchyDict = collections.OrderedDict() self.outputDir = None self.outputDirName = "_RadiomicsData" self.datafile = None self.datafileName = '' # Feature Data self.FeatureVectors = [] self.AdvancedSettings = {} self.KeywordMatchSettings = {} if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) else: self.parent = parent self.layout = self.parent.layout() if not parent: self.setup() self.input1Selector.setMRMLScene(slicer.mrmlScene) self.input2Selector.setMRMLScene(slicer.mrmlScene) self.parent.show()
def __init__(self, parent, logic, configurationName='Default', sliceletDockWidgetPosition=qt.Qt.LeftDockWidgetArea): logging.debug('Guidelet.__init__') self.sliceletDockWidgetPosition = sliceletDockWidgetPosition self.parent = parent self.logic = logic self.configurationName = configurationName self.parameterNodeObserver = None self.parameterNode = self.logic.getParameterNode() self.layoutManager = slicer.app.layoutManager() self.layoutNameToIdMap = {} self.layoutNameToSelectCallbackMap = {} self.defaultLayoutName = self.VIEW_ULTRASOUND self.logic.updateParameterNodeFromSettings(self.parameterNode, self.configurationName) self.setAndObserveParameterNode(self.parameterNode) self.ultrasound = self.getUltrasoundClass() self.fitUltrasoundImageToViewOnConnect = True self.setupConnectorNode() self.sliceletDockWidget = qt.QDockWidget(self.parent) self.mainWindow = slicer.util.mainWindow() self.sliceletDockWidget.setParent(self.mainWindow) self.mainWindow.addDockWidget(self.sliceletDockWidgetPosition, self.sliceletDockWidget) self.sliceletPanel = qt.QFrame(self.sliceletDockWidget) self.sliceletPanelLayout = qt.QVBoxLayout(self.sliceletPanel) self.sliceletDockWidget.setWidget(self.sliceletPanel) self.topPanelLayout = qt.QGridLayout(self.sliceletPanel) self.sliceletPanelLayout.addLayout(self.topPanelLayout) self.setupTopPanel() self.setupFeaturePanelList() self.setupAdvancedPanel() self.setupAdditionalPanel() self.addConnectorObservers() self.setupConnections() self.sliceletDockWidget.setStyleSheet(self.loadStyleSheet())
def __init__(self, parent=None): self.currentRegistrationInterface = None self.changeIslandTool = None self.editUtil = EditorLib.EditUtil.EditUtil() self.inputImageNode = None self.localCardiacEditorWidget = None if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) else: self.parent = parent self.layout = self.parent.layout() if not parent: self.setup() self.parent.show()
def createUserInterface(self): ''' ''' self.__layout = super(EMSegmentDefinePreprocessingStep, self).createUserInterface() # # dynamic frame # dynamicFrame = qt.QGroupBox() dynamicFrame.setTitle('Check List') dynamicFrame.toolTip = 'Please check anything applicable.' self.__layout.addWidget(dynamicFrame) dynamicFrameLayout = qt.QVBoxLayout(dynamicFrame) # .. now pass the layout to the dynamicFrame self.dynamicFrame().setLayout(dynamicFrameLayout)
def connect(self): self.updatePydevdPath() import pydevd # Return if already connected if pydevd.connected: qt.QMessageBox.warning( slicer.util.mainWindow(), "Connect to PyDev remote debug server", 'You are already connected to the remote debugger. If the connection is broken (e.g., because the server terminated the connection) then you need to restart Slicer to be able to connect again.' ) return # Show a dialog that explains that Slicer will hang self.info = qt.QDialog() self.info.setModal(False) self.infoLayout = qt.QVBoxLayout() self.info.setLayout(self.infoLayout) self.label = qt.QLabel( "Connecting to remote debug server at port {0}...\nSlicer is paused until {1} accepts the connection." .format(self.portNumber, self.getDebugger()), self.info) self.infoLayout.addWidget(self.label) self.info.show() self.info.repaint() qt.QTimer.singleShot(2000, self.onConnectionComplete) # Connect to the debugger try: pydevd.settrace('localhost', port=self.portNumber, stdoutToServer=True, stderrToServer=True, suspend=False) except Exception, e: self.info.hide() import traceback traceback.print_exc() qt.QMessageBox.warning( slicer.util.mainWindow(), "Connect to PyDev remote debug server", 'An error occurred while trying to connect to PyDev remote debugger. Make sure he pydev server is started.\n\n' + str(e)) if self.connectionCompleteCallback: self.connectionCompleteCallback(False) return
def __init__(self, parent=0, parameter='label', colorNode=None): self.observerTags = [] self.parameterNode = None self.parameterNodeTag = None self.parameter = parameter self.editUtil = EditUtil.EditUtil() self.colorBox = None self.colorNode = colorNode if parent == 0: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) self.create() self.parent.show() else: self.parent = parent self.create()
def create(self): """Overriden from the parent. Called in init method. Similar to parent's one but restricting the available options""" # the buttons self.rowFrames = [] self.actions = {} self.buttons = {} self.icons = {} self.callbacks = {} self.findEffects() self.mainFrame = qt.QFrame(self.parent) self.mainFrame.objectName = 'MainFrame' vbox = qt.QVBoxLayout() self.mainFrame.setLayout(vbox) self.parent.layout().addWidget(self.mainFrame) # create all of the buttons that are going to be used #self.createButtonRow( ("DefaultTool", "PaintEffect", "DrawEffect", "LevelTracingEffect", "RectangleEffect", "EraseLabel", "PreviousCheckPoint", "NextCheckPoint") ) self.createButtonRow(self.activeTools) #self.createButtonRow( ("PreviousCheckPoint", "NextCheckPoint"), rowLabel="Undo/Redo: " ) # # the labels # self.toolsActiveToolFrame = qt.QFrame(self.parent) self.toolsActiveToolFrame.setLayout(qt.QHBoxLayout()) self.parent.layout().addWidget(self.toolsActiveToolFrame) self.toolsActiveTool = qt.QLabel(self.toolsActiveToolFrame) self.toolsActiveTool.setText('Active Tool:') self.toolsActiveTool.setStyleSheet( "background-color: rgb(232,230,235)") self.toolsActiveToolFrame.layout().addWidget(self.toolsActiveTool) self.toolsActiveToolName = qt.QLabel(self.toolsActiveToolFrame) self.toolsActiveToolName.setText('') self.toolsActiveToolName.setStyleSheet( "background-color: rgb(232,230,235)") self.toolsActiveToolFrame.layout().addWidget(self.toolsActiveToolName) #vbox.addStretch(1) self.updateUndoRedoButtons() self.setDefaultParams()
def __init__(self, logic): super(LandmarksWidget, self).__init__() self.logic = logic self.volumeNodes = [] self.selectedLandmark = None # a landmark name self.landmarkGroupBox = None # a QGroupBox self.buttons = {} # the current buttons in the group box self.pendingUpdate = False # update on new scene nodes self.updatingFiducials = False # don't update while update in process self.observerTags = [] # for monitoring fiducial changes self.movingView = None # layoutName of slice node where fiducial is being moved self.widget = qt.QWidget() self.layout = qt.QFormLayout(self.widget) self.landmarkArrayHolder = qt.QWidget() self.landmarkArrayHolder.setLayout(qt.QVBoxLayout()) self.layout.addRow(self.landmarkArrayHolder) self.updateLandmarkArray()
def __init__(self, parent=None): self.chartOptions = ("Count", "Volume mm^3", "Volume cc", "Min", "Max", "Mean", "StdDev") if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) else: self.parent = parent self.logic = None self.grayscaleNode = None self.labelNode = None self.fileName = None self.fileDialog = None if not parent: self.setup() self.grayscaleSelector.setMRMLScene(slicer.mrmlScene) self.labelSelector.setMRMLScene(slicer.mrmlScene) self.parent.show()
def __init__(self): settings = qt.QSettings() directory = settings.value('DatabaseDirectory') self.db = qt.QSqlDatabase.addDatabase("QSQLITE") self.db.setDatabaseName('%s/ctkDICOM.sql' % directory) self.db.open() self.dialog = qt.QDialog() self.dialog.setWindowTitle('Study Browser') self.dialog.setLayout(qt.QVBoxLayout()) self.studyTable = DICOMStudyTable(self.dialog,self.db) self.dialog.layout().addWidget(self.studyTable.view) self.seriesTable = DICOMSeriesTable(self.dialog,self.db) self.dialog.layout().addWidget(self.seriesTable.view) self.studyTable.view.connect('clicked(QModelIndex)',self.onStudyClicked) self.dialog.show()
def __init__(self, parent=None, width=400, height=400, showWidget=False, scale=False): super(LayerReveal, self).__init__() self.width = width self.height = height self.showWidget = showWidget self.scale = scale self.renderer = None # utility Qt instances for use in methods self.gray = qt.QColor() self.gray.setRedF(0.5) self.gray.setGreenF(0.5) self.gray.setBlueF(0.5) # a painter to use for various jobs self.painter = qt.QPainter() # make a qwidget display if self.showWidget: self.frame = qt.QFrame(parent) mw = slicer.util.mainWindow() self.frame.setGeometry(mw.x, mw.y, self.width, self.height) self.frameLayout = qt.QVBoxLayout(self.frame) self.label = qt.QLabel() self.frameLayout.addWidget(self.label) self.frame.show() # make an image actor in the slice view self.vtkImage = vtk.vtkImageData() self.mrmlUtils = slicer.qMRMLUtils() self.imageMapper = vtk.vtkImageMapper() self.imageMapper.SetColorLevel(128) self.imageMapper.SetColorWindow(255) if vtk.VTK_MAJOR_VERSION <= 5: self.imageMapper.SetInput(self.vtkImage) else: self.imageMapper.SetInputData(self.vtkImage) self.actor2D = vtk.vtkActor2D() self.actor2D.SetMapper(self.imageMapper)
def __init__(self, parentWidget=None): """Widget constructor. :param parentWidget: widget that will contain the LoadSaveDataWidget""" if not parentWidget: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) else: self.parent = parentWidget self.layout = self.parent.layout() # Init variables self.currentVolumeDisplayed = None self.currentLabelMapDispayed = None self.__saveVolumes__ = False self.__saveLabelMaps__ = True self.__disabledSave__ = False self.initEvents()
def __init__(self, parent=None): if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) else: self.parent = parent self.layout = self.parent.layout() # this flag is 1 if there is an update in progress self.__updating = 1 self.__mvNode = None self.extractFrame = False # image play setup self.timer = qt.QTimer() self.timer.setInterval(50) self.timer.connect('timeout()', self.goToNext)
def __init__( self, widgetClass=None ): self.parent = qt.QFrame() self.parent.setLayout( qt.QVBoxLayout() ) # TODO: should have way to pop up python interactor self.buttons = qt.QFrame() self.buttons.setLayout( qt.QHBoxLayout() ) self.parent.layout().addWidget( self.buttons ) self.addDataButton = qt.QPushButton( "Add Data" ) self.buttons.layout().addWidget( self.addDataButton ) self.addDataButton.connect( "clicked()", slicer.app.ioManager().openAddDataDialog ) self.loadSceneButton = qt.QPushButton( "Load Scene" ) self.buttons.layout().addWidget( self.loadSceneButton ) self.loadSceneButton.connect( "clicked()", slicer.app.ioManager().openLoadSceneDialog ) if widgetClass: self.widget = widgetClass( self.parent ) self.widget.setup() self.parent.show()
def __init__(self, parent=None): if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) else: self.parent = parent self.layout = self.parent.layout() if not parent: self.setup() self.parent.show() self.inputPatientDir = self.outputPatientDir = {} self.converterSettings = {} self.converterSettings['convertcontours'] = 'None' self.converterSettings["fileformat"] = ".nrrd" self.converterSettings["inferpatientid"] = "metadata" self.converterSettings["centerimages"] = False self.converterSettings["centerlabels"] = False
def __init__(self, parent=None): self.editUtil = EditUtil.EditUtil() # mrml volume node instances self.master = None self.merge = None self.masterWhenMergeWasSet = None # string self.createMergeOptions = "" # pairs of (node instance, observer tag number) self.observerTags = [] # instance of a ColorBox self.colorBox = None # slicer helper class self.applicationLogic = slicer.app.applicationLogic() self.volumesLogic = slicer.modules.volumes.logic() self.colorLogic = slicer.modules.colors.logic() # qt model/view classes to track per-structure volumes self.structures = qt.QStandardItemModel() self.items = [] self.brushes = [] # widgets that are dynamically created on demand self.colorSelect = None self.labelSelect = None self.labelSelector = None # pseudo signals # - python callable that gets True or False self.mergeValidCommand = None self.selectCommand = None # mrml node for invoking command line modules self.CLINode = None if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) self.create() self.parent.show() else: self.parent = parent self.create()
def __init__(self, parent=None): self.testingServer = None # TODO: are these wrapped so we can avoid magic numbers? self.dicomModelUIDRole = 32 self.dicomModelTypeRole = self.dicomModelUIDRole + 1 self.dicomModelTypes = ('Root', 'Patient', 'Study', 'Series', 'Image') if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) self.layout = self.parent.layout() self.setup() self.parent.show() else: self.parent = parent self.layout = parent.layout() globals()['d'] = self
def __init__(self, parent=None): if parent is None: self.fixed = None self.moving = None self.fixedVolumeSelector = None self.movingVolumeSelector = None self.interactor = None self.selector = None self.slicerVersion = None # Boilerplate code self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) self.layout = self.parent.layout() self.setup() self.parent.show() else: self.parent = parent self.layout = self.parent.layout() self.logic = FastFiducialLogic()
def __init__(self, parent=None): if not parent: self.parent = qt.QWidget() self.parent.setLayout(qt.QVBoxLayout()) else: self.parent = parent self.layout = self.parent.layout() if not parent: self.setup() self.parent.show() self.extensionProject = None self.extensionDescription = None self.extensionLocation = None self.templateManager = None self.setupTemplates()
def delayDisplay(message,autoCloseMsec=1000): """Display an information message in a popup window for a short time. If autoCloseMsec>0 then the window is closed after waiting for autoCloseMsec milliseconds If autoCloseMsec=0 then the window is not closed until the user clicks on it. """ from __main__ import qt, slicer import logging logging.info(message) messagePopup = qt.QDialog() layout = qt.QVBoxLayout() messagePopup.setLayout(layout) label = qt.QLabel(message,messagePopup) layout.addWidget(label) if autoCloseMsec>0: qt.QTimer.singleShot(autoCloseMsec, messagePopup.close) else: okButton = qt.QPushButton("OK") layout.addWidget(okButton) okButton.connect('clicked()', messagePopup.close) messagePopup.exec_()