I am making a custom maptool for QGIS I am overriding canvasReleaseEvent. when the user clicks on part of map canvas I call another function which identifies and creates a list of identified feature (there is some logic to create the list). Then this list is used to create the selection interface like the one below:
So far everything works well. The problem is,my program doesn't wait for the result from Selection Dialog box :
def canvasReleaseEvent(self, event): parrent=self.select_parent_feature('structurepoint',event) #here the program should wait till the result from parrent is ready self.main_dlg.ParrentID_txt.setText(parrent)
Here is the function which creates the selection list, shows dlg and lets user to select
def select_parent_feature(self,layer_name,e): '''This Functtion will show a list of all features in clicked point and returns user selection :param Layer_name: Qgis Layer name should be Already open. :type Layer_name: string :param e: is mouse event :type e: event ''' #Start of creating list and identifieng the features global selection_list_header #this is the list of headers of table selection="" selection_done_flag=False identified_parent_list= for lyr in QgsMapLayerRegistry.instance().mapLayers().values(): if lyr.name() == layer_name:LayerID = lyr features = QgsMapToolIdentify(self.canvas).identify(e.x(), e.y(), [LayerID], QgsMapToolIdentify.TopDownAll) if len(features) > 0:#to make sure there is feature in clicked area if len(features)==1:#if there is only one item there is no need for the selection list feature = features.mFeature# the list only has one element selection=feature['id'] selection_done_flag=True else: # show list to the user to select from for obj in features: feature = obj.mFeature info=[feature['id'],feature['size']] identified_parent_list.append(info) info="" table=self.selectionList_dlg.Selectionlist_tbl table.setColumnCount(len(selection_list_header)) for i in range(len(identified_parent_list)): table.insertRow(i) column_index=0#the following line sets the headers for item in selection_list_header: table.setHorizontalHeaderItem(column_index, QTableWidgetItem(item)) column_index+=1 row_number=0#the following loop populates the value in table and lock the cells for item in identified_parent_list: for column_index in range(len(selection_list_header)): cell_value=QTableWidgetItem(item[column_index]) cell_value.setFlags(QtCore.Qt.ItemIsEnabled)#lock the cell table.setItem(row_number,column_index,cell_value) row_number+=1 #end of logic for createn selection list DLG #this it where my program doesnt work self.selectionList_dlg.show() result = self.main_dlg.exec_() # we need to wait for the result to be ready if result: current_row_number=table.currentRow() if current_row_number<>-1: selection=table.item(current_row_number,0).text()#we asssumed the id is located on column 0 selection_done_flag=True #I tried to use wait until and it explodes the program #while not selection_done_flag:#Wait till the user select from the list #time.sleep(0.0001) return selection
As the program shows, I defined a flag to check and wait until the flag is true but that explodes the program.
the problem is the last part of the program where we show the selection list and the user has to select before the program can continue