def setupCompleter(self): # set up string list for completer TOMsMessageLog.logMessage("In setupCompleter:", level=Qgis.Info) lookupStringSet = set() # https://gis.stackexchange.com/questions/155805/qstringlist-error-in-plugin-of-qgis-2-10 self.GazetteerLayer = QgsProject.instance().mapLayersByName("StreetGazetteerRecords")[0] for row in self.GazetteerLayer.getFeatures(): streetName = row.attribute("Descriptor_") locality = row.attribute("Locality") nameString = streetName if locality: nameString = nameString + ", " + locality if nameString: TOMsMessageLog.logMessage("In setupCompleter: nameString: " + nameString, level=Qgis.Info) lookupStringSet.add(nameString) # self.gazetteerStringList.append((nameString)) completer = QCompleter() completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setFilterMode(Qt.MatchContains) self.searchTextbox.setCompleter(completer) model = QStringListModel() completer.setModel(model) model.setStringList(self.gazetteerStringList) model.setStringList(sorted(lookupStringSet))
def update_models_completer(self): completer = QCompleter(self.ilicache.model, self.ili_models_line_edit) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setFilterMode(Qt.MatchContains) self.delegate = ModelCompleterDelegate() completer.popup().setItemDelegate(self.delegate) self.ili_models_line_edit.setCompleter(completer) self.multiple_models_dialog.models_line_edit.setCompleter(completer)
def __init__(self, parent, title): QWizardPage.__init__(self, parent) self.workflow_wizard = parent self.setupUi(self) self.setTitle(title) self.workflow_wizard = parent self.is_complete = True self.model_list_view.setModel(self.workflow_wizard.import_models_model) self.model_list_view.clicked.connect( self.workflow_wizard.import_models_model.check) self.model_list_view.space_pressed.connect( self.workflow_wizard.import_models_model.check) self.model_list_view.model().modelReset.connect( self._update_models_dependent_info) self.crs = QgsCoordinateReferenceSystem() self.ili2db_options = Ili2dbOptionsDialog(self) self.ili2db_options_button.clicked.connect(self.ili2db_options.open) self.ili2db_options.finished.connect(self._fill_toml_file_info_label) self.crsSelector.crsChanged.connect(self._crs_changed) self.ilimetaconfigcache = IliDataCache( self.workflow_wizard.import_schema_configuration.base_configuration ) self.metaconfig_delegate = MetaConfigCompleterDelegate() self.metaconfig = configparser.ConfigParser() self.current_models = None self.current_metaconfig_id = None self.ili_metaconfig_line_edit.setPlaceholderText( self.tr("[Search metaconfig / topping from UsabILIty Hub]")) self.ili_metaconfig_line_edit.setEnabled(False) completer = QCompleter(self.ilimetaconfigcache.model, self.ili_metaconfig_line_edit) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setFilterMode(Qt.MatchContains) completer.popup().setItemDelegate(self.metaconfig_delegate) self.ili_metaconfig_line_edit.setCompleter(completer) self.ili_metaconfig_line_edit.textChanged.emit( self.ili_metaconfig_line_edit.text()) self.ili_metaconfig_line_edit.textChanged.connect( self._complete_metaconfig_completer) self.ili_metaconfig_line_edit.punched.connect( self._complete_metaconfig_completer) self.ili_metaconfig_line_edit.textChanged.connect( self._on_metaconfig_completer_activated) self.workflow_wizard.ilireferencedatacache.model_refreshed.connect( self._update_linked_models)
def set_completer_lineedit(qlineedit, list_items): """ Set a completer into a QLineEdit :param qlineedit: Object where to set the completer (QLineEdit) :param list_items: List of items to set into the completer (List)["item1","item2","..."] """ completer = QCompleter() completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setMaxVisibleItems(10) completer.setCompletionMode(0) completer.setFilterMode(Qt.MatchContains) completer.popup().setStyleSheet("color: black;") qlineedit.setCompleter(completer) model = QStringListModel() model.setStringList(list_items) completer.setModel(model)
class QCercadorAdreca(QObject): sHanTrobatCoordenades = pyqtSignal(int, 'QString') # atencion def __init__(self, lineEditCarrer, lineEditNumero, origen='SQLITE'): super().__init__() # self.pare= pare self.origen = origen self.leCarrer = lineEditCarrer self.leNumero = lineEditNumero self.connectarLineEdits() self.carrerActivat = False self.dictCarrers = {} self.dictNumeros = collections.defaultdict(dict) # self.db.setConnectOptions("QSQLITE_OPEN_READONLY") self.numClick=0 self.db = QvApp().dbGeo if self.db is None: # not self.db.open(): # En caso de que no se abra QMessageBox.critical(None, "Error al abrir la base de datos.\n\n" "Click para cancelar y salir.", QMessageBox.Cancel) self.query = QSqlQuery(self.db) # Intancia del Query self.txto = '' self.calle_con_acentos = '' self.habilitaLeNum() self.iniAdreca() if self.llegirAdreces(): # si se ha podido leer las direciones... creando el diccionario... self.prepararCompleterCarrer() def habilitaLeNum(self): self.carrerActivat = False return # De moment no es desactivarà mai # Hauria de funcionar només amb la primera condició, però per raons que escapen al meu coneixement, no anava :() self.leNumero.setEnabled( self.calle_con_acentos != '' or self.txto != '') def cercadorAdrecaFi(self): if self.db.isOpen(): self.db.close() def prepararCompleterCarrer(self): # creo instancia de completer que relaciona diccionario de calles con lineEdit # self.completerCarrer = QCompleter(self.dictCarrers, self.leCarrer) self.completerCarrer = CompleterAdreces( self.dictCarrers, self.leCarrer) # Determino funcionamiento del completer self.completerCarrer.setFilterMode(QtCore.Qt.MatchContains) self.completerCarrer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) # Funcion que se ejecutará cuando self.completerCarrer.activated.connect(self.activatCarrer) # Asigno el completer al lineEdit self.leCarrer.setCompleter(self.completerCarrer) def prepararCompleterNumero(self): self.dictNumerosFiltre = self.dictNumeros[self.codiCarrer] self.completerNumero = QCompleter( self.dictNumerosFiltre, self.leNumero) self.completerNumero.activated.connect(self.activatNumero) self.completerNumero.setFilterMode(QtCore.Qt.MatchStartsWith) self.completerNumero.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.leNumero.setCompleter(self.completerNumero) # self.leNumero.setValidator(ValidadorNums(self.dictNumeros[self.codiCarrer],self)) def iniAdreca(self): self.iniAdrecaCarrer() self.iniAdrecaNumero() def iniAdrecaCarrer(self): self.nomCarrer = '' self.codiCarrer = '' def iniAdrecaNumero(self): self.numeroCarrer = '' self.coordAdreca = None self.infoAdreca = None def connectarLineEdits(self): self.leCarrer.textChanged.connect(self.esborrarNumero) self.leCarrer.editingFinished.connect(self.trobatCarrer) # CUARENTENA # self.leCarrer.mouseDoubleClickEvent = self.clear_leNumero_leCarrer self.leCarrer.mouseDoubleClickEvent = self.SeleccPalabraOTodoEnFrase self.leCarrer.setAlignment(Qt.AlignLeft) self.leNumero.editingFinished.connect(self.trobatNumero) # self.leNumero.returnPressed.connect(self.trobatNumero) def SeleccPalabraOTodoEnFrase(self, event): """ Funcion conectada al dobleclick. Si se dobleclica 1 vez---> selecciona la palabra (lo que hay entre dos blancos) Se se dobleclica 2 veces---> selecciona toda la frase """ self.carrerActivat=False # self.numClick en def __init__ se inicializa a 0 if self.numClick == 1: # segundo doble click => seleccionar toda la frase self.leCarrer.selectAll() self.numClick =-1 else: # primer doble click selecciona la palabra # Limite de la palabra por la izquierda (blanco o inicio por izquierda) self.ii = self.leCarrer.cursorPosition() - 1 while self.ii >=0 and self.leCarrer.text()[self.ii] != ' ': self.ii -= 1 ; self.inicio= self.ii # Limite de la palabra por la derecha (blanco o fin por derecha) self.ii= self.leCarrer.cursorPosition() - 1 while self.ii < len(self.leCarrer.text()) and self.leCarrer.text()[self.ii] != ' ': self.ii += 1 ; self.fin= self.ii # selecciona palabra en frase por posicion self.leCarrer.setSelection(self.inicio+1,self.fin-self.inicio-1) self.numClick += 1 # CUARENTENA # def clear_leNumero_leCarrer(self, carrer): # self.carrerActivat = False # self.leNumero.clear() # self.leCarrer.clear() # Venimos del completer, un click en desplegable .... def activatCarrer(self, carrer): self.carrerActivat = True # print(carrer) carrer=carrer.replace('(var) ','') # if chr(29) in carrer: # carrer=carrer.split(chr(29))[0] nn = carrer.find(chr(30)) if nn == -1: ss = carrer else: ss = carrer[0:nn-1] # ss=ss.replace('(var) ','') self.calle_con_acentos = ss.rstrip() self.leCarrer.setAlignment(Qt.AlignLeft) self.leCarrer.setText(self.calle_con_acentos) # self.leCarrer.setText(carrer) self.iniAdreca() if carrer in self.dictCarrers: self.nomCarrer = carrer self.codiCarrer = self.dictCarrers[self.nomCarrer] try: index = 0 # self.query = QSqlQuery() # Intancia del Query # self.query.exec_("select codi, num_lletra_post, etrs89_coord_x, etrs89_coord_y, num_oficial from Numeros where codi = '" + self.codiCarrer +"'") self.query.exec_( "select codi,case num_lletra_post when '0' then ' ' else num_lletra_post end, etrs89_coord_x, etrs89_coord_y, num_oficial from Numeros where codi = '" + self.codiCarrer + "'") # self.query.exec_("select codi,case num_lletra_post when '0' then ' ' else num_lletra_post end, etrs89_coord_x, etrs89_coord_y, case num_oficial when '0' then ' ' else num_oficial end from Numeros where codi = '" + self.codiCarrer +"'") while self.query.next(): row = collections.OrderedDict() row['NUM_LLETRA_POST'] = self.query.value( 1) # Numero y Letra row['ETRS89_COORD_X'] = self.query.value(2) # coor x row['ETRS89_COORD_Y'] = self.query.value(3) # coor y row['NUM_OFICIAL'] = self.query.value(4) # numero oficial self.dictNumeros[self.codiCarrer][self.query.value( 1)] = row index += 1 self.query.finish() # self.db.close() self.prepararCompleterNumero() self.focusANumero() except Exception as e: print(str(e)) msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(str(sys.exc_info()[1])) # msg.setInformativeText("OK para salir del programa \nCANCEL para seguir en el programa") msg.setWindowTitle("qVista ERROR") msg.setStandardButtons(QMessageBox.Close) retval = msg.exec_() # No fem res amb el valor de retorn (???) print('QCercadorAdreca.iniAdreca(): ', sys.exc_info()[0], sys.exc_info()[1]) return False else: pass else: info = "ERROR >> [1]" self.sHanTrobatCoordenades.emit(1, info) # adreça vacia self.habilitaLeNum() # self.prepararCompleterNumero() # self.focusANumero() def trobatCarrer(self): if self.leCarrer.text() == '': self.leNumero.setCompleter(None) return if not self.carrerActivat: # print(self.leCarrer.text()) # així obtenim el carrer on estàvem encara que no l'haguem seleccionat explícitament self.txto = self.completerCarrer.popup().currentIndex().data() if self.txto is None: self.txto = self.completerCarrer.currentCompletion() if self.txto == '': return # self.txto=self.txto.split(chr(29))[0] nn = self.txto.find(chr(30)) self.txto=self.txto.replace('(var) ','') if nn == -1: ss = self.txto else: ss = self.txto[0:nn-1] # ss=ss.replace('(var) ','') # ss= self.txto[0:nn-1] self.calle_con_acentos = ss.rstrip() self.leCarrer.setAlignment(Qt.AlignLeft) self.leCarrer.setText(self.calle_con_acentos) self.iniAdreca() if self.txto != self.nomCarrer: # self.iniAdreca() if self.txto in self.dictCarrers: self.nomCarrer = self.txto self.codiCarrer = self.dictCarrers[self.nomCarrer] self.focusANumero() try: index = 0 # self.query = QSqlQuery() # Intancia del Query # self.query.exec_("select codi, num_lletra_post, etrs89_coord_x, etrs89_coord_y, num_oficial from Numeros where codi = '" + self.codiCarrer +"'") self.query.exec_( "select codi,case num_lletra_post when '0' then ' ' else num_lletra_post end, etrs89_coord_x, etrs89_coord_y, num_oficial from Numeros where codi = '" + self.codiCarrer + "'") while self.query.next(): row = collections.OrderedDict() row['NUM_LLETRA_POST'] = self.query.value( 1) # Numero y Letra row['ETRS89_COORD_X'] = self.query.value( 2) # coor x row['ETRS89_COORD_Y'] = self.query.value( 3) # coor y row['NUM_OFICIAL'] = self.query.value( 4) # numero oficial self.dictNumeros[self.codiCarrer][self.query.value( 1)] = row index += 1 self.query.finish() # self.db.close() self.prepararCompleterNumero() self.focusANumero() except Exception as e: print(str(e)) msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(str(sys.exc_info()[1])) # msg.setInformativeText("OK para salir del programa \nCANCEL para seguir en el programa") msg.setWindowTitle("qVista ERROR") msg.setStandardButtons(QMessageBox.Close) retval = msg.exec_() # No fem res amb el valor de retorn (???) print('QCercadorAdreca.iniAdreca(): ', sys.exc_info()[0], sys.exc_info()[1]) return False else: info = "ERROR >> [2]" # direccion no está en diccicionario self.sHanTrobatCoordenades.emit(2, info) self.iniAdreca() else: info = "ERROR >> [3]" self.sHanTrobatCoordenades.emit(3, info) # nunca else: info = "ERROR >> [4]" self.sHanTrobatCoordenades.emit(4, info) # adreça vac self.habilitaLeNum() def llegirAdreces(self): if self.origen == 'SQLITE': ok = self.llegirAdrecesSQlite() else: ok = False return ok def llegirAdrecesSQlite(self): try: index = 0 # self.query = QSqlQuery() # Intancia del Query self.query.exec_( "select codi , nom_oficial , variants from Carrers") while self.query.next(): codi_carrer = self.query.value(0) # Codigo calle nombre = self.query.value(1) # numero oficial variants = self.query.value(2).lower() # Variants del nom nombre_sin_acentos = self.remove_accents(nombre) if nombre == nombre_sin_acentos: # clave= nombre + " (" + codi_carrer + ")" clave = nombre + \ " (" + codi_carrer + \ ") " + \ chr(30) else: clave = nombre + " (" + codi_carrer + ") "+chr( 30)+" " + nombre_sin_acentos # asignacion al diccionario variants.replace(',', 50*' ') clave += chr(29)+50*' '+variants self.dictCarrers[clave] = codi_carrer index += 1 self.query.finish() # self.db.close() return True except Exception as e: print(str(e)) msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(str(sys.exc_info()[1])) # msg.setInformativeText("OK para salir del programa \nCANCEL para seguir en el programa") msg.setWindowTitle("qVista ERROR") msg.setStandardButtons(QMessageBox.Close) retval = msg.exec_() # No fem res amb el valor de retorn (???) print('QCercadorAdreca.llegirAdrecesSQlite(): ', sys.exc_info()[0], sys.exc_info()[1]) return False # Normalización caracteres quitando acentos def remove_accents(self, input_str): nfkd_form = unicodedata.normalize('NFKD', input_str) only_ascii = nfkd_form.encode('ASCII', 'ignore') return only_ascii.decode("utf8") def activatNumero(self, txt): self.leNumero.setText(txt) self.iniAdrecaNumero() # if self.leCarrer.text() in self.dictCarrers: # self.txto = self.completerCarrer.currentCompletion() self.txto = self.completerCarrer.popup().currentIndex().data() if self.txto is None: self.txto = self.completerCarrer.currentCompletion() self.txto=self.txto.replace('(var) ','') if self.txto in self.dictCarrers: if txt in self.dictNumerosFiltre: self.numeroCarrer = txt self.infoAdreca = self.dictNumerosFiltre[self.numeroCarrer] self.coordAdreca = QgsPointXY(float(self.infoAdreca['ETRS89_COORD_X']), float(self.infoAdreca['ETRS89_COORD_Y'])) self.NumeroOficial = self.infoAdreca['NUM_OFICIAL'] self.leNumero.setText(self.NumeroOficial) self.leNumero.clearFocus() info = "[0]" self.sHanTrobatCoordenades.emit(0, info) if self.leNumero.text() == ' ': self.leNumero.clear() else: info = "ERROR >> [5]" self.sHanTrobatCoordenades.emit(5, info) # numero def trobatNumero(self): # Si no hi ha carrer, eliminem el completer del número if self.leCarrer.text() == '': self.leNumero.setCompleter(None) if self.leNumero.text() == '': return # self.txto = self.completerCarrer.currentCompletion() try: # if self.leCarrer.text() in self.dictCarrers: self.txto = self.completerCarrer.popup().currentIndex().data() if self.txto is None: self.txto = self.completerCarrer.currentCompletion() self.txto=self.txto.replace('(var) ','') if self.txto in self.dictCarrers: if self.leNumero.text() != '': txt = self.completerNumero.popup().currentIndex().data() if txt is None: txt = self.completerNumero.currentCompletion() # txt = self.completerNumero.currentCompletion() self.leNumero.setText(txt) else: txt = ' ' if txt != '': # and txt != self.numeroCarrer: self.iniAdrecaNumero() if self.nomCarrer != '': if txt in self.dictNumerosFiltre: self.numeroCarrer = txt self.infoAdreca = self.dictNumerosFiltre[self.numeroCarrer] self.coordAdreca = QgsPointXY(float(self.infoAdreca['ETRS89_COORD_X']), float(self.infoAdreca['ETRS89_COORD_Y'])) self.NumeroOficial = self.infoAdreca['NUM_OFICIAL'] self.leNumero.clearFocus() self.leNumero.setText(self.NumeroOficial) info = "[0]" self.sHanTrobatCoordenades.emit(0, info) if self.leNumero.text() == ' ': self.leNumero.clear() else: info = "ERROR >> [6]" # numero no está en diccicionario self.sHanTrobatCoordenades.emit(6, info) else: info = "ERROR >> [7]" self.sHanTrobatCoordenades.emit( 7, info) # adreça vacia nunca else: info = "ERROR >> [8]" self.sHanTrobatCoordenades.emit( 8, info) # numero en blanco else: self.leNumero.clear() info = "ERROR >> [9]" self.sHanTrobatCoordenades.emit(9, info) # numero en blanco except: return msg = QMessageBox() msg.setIcon(QMessageBox.Warning) info_rsc = 'ERROR: ' + str(sys.exc_info()[0]) msg.setText(info_rsc) # msg.setInformativeText("OK para salir del programa \nCANCEL para seguir en el programa") msg.setWindowTitle("qVista >> QVCercadorAdreca>> trobatNumero") msg.setStandardButtons(QMessageBox.Close) retval = msg.exec_() # No fem res amb el valor de retorn (???) def focusANumero(self): self.leNumero.setFocus() def esborrarNumero(self): # self.carrerActivat = False self.calle_con_acentos = '' self.leNumero.clear()
def __init__(self, parent, title): QWizardPage.__init__(self, parent) self.workflow_wizard = parent self.setupUi(self) self.setTitle(title) self.workflow_wizard = parent self.is_complete = True self.basket_handling = False self.workflow_wizard.ilireferencedatacache.file_download_succeeded.connect( lambda dataset_id, path: self._on_referencedata_received(path) ) self.workflow_wizard.ilireferencedatacache.file_download_failed.connect( self._on_referencedata_failed ) self.ilireferencedata_delegate = MetaConfigCompleterDelegate() self.ilireferencedata_line_edit.setPlaceholderText( self.tr("[Search referenced data files from UsabILIty Hub]") ) self.ilireferencedata_line_edit.setEnabled(False) completer = QCompleter( self.workflow_wizard.ilireferencedatacache.model, self.ilireferencedata_line_edit, ) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setFilterMode(Qt.MatchContains) completer.popup().setItemDelegate(self.ilireferencedata_delegate) self.ilireferencedata_line_edit.setCompleter(completer) self.ilireferencedata_line_edit.textChanged.emit( self.ilireferencedata_line_edit.text() ) self.ilireferencedata_line_edit.textChanged.connect( self._complete_referencedata_completer ) self.ilireferencedata_line_edit.punched.connect( self._complete_referencedata_completer ) self.add_button.clicked.connect(self._add_row) self.remove_button.clicked.connect(self._remove_selected_rows) self.add_button.setEnabled(False) self.ilireferencedata_line_edit.textChanged.connect( lambda: self.add_button.setEnabled(self._valid_referencedata()) ) self.remove_button.setEnabled(self._valid_selection()) self.file_table_view.clicked.connect( lambda: self.remove_button.setEnabled(self._valid_selection()) ) self.add_button.setIcon(QgsApplication.getThemeIcon("/symbologyAdd.svg")) self.remove_button.setIcon(QgsApplication.getThemeIcon("/symbologyRemove.svg")) self.workflow_wizard.import_data_file_model.sourceModel().setHorizontalHeaderLabels( [self.tr("Import File"), self.tr("Catalogue"), self.tr("Dataset")] ) self.file_table_view.setModel(self.workflow_wizard.import_data_file_model) self.file_table_view.horizontalHeader().setSectionResizeMode( gui_utils.SourceModel.Columns.SOURCE, QHeaderView.Stretch ) self.file_table_view.horizontalHeader().setSectionResizeMode( gui_utils.SourceModel.Columns.IS_CATALOGUE, QHeaderView.ResizeToContents ) self.file_table_view.horizontalHeader().setSectionResizeMode( gui_utils.SourceModel.Columns.DATASET, QHeaderView.ResizeToContents ) self.file_table_view.verticalHeader().setSectionsMovable(True) self.file_table_view.verticalHeader().setDragEnabled(True) self.file_table_view.verticalHeader().setDragDropMode(QHeaderView.InternalMove) self.file_table_view.resizeColumnsToContents() self.workflow_wizard.import_data_file_model.dataChanged.connect( self._update_delegates ) self.db_connector = None self.datasetmanager_dlg = None self.datasetmanager_button.setCheckable(True) self.datasetmanager_button.clicked.connect(self._show_datasetmanager_dialog) self.datasetmanager_button.setIcon( QIcon( os.path.join( os.path.dirname(__file__), "../../images/QgisModelBaker-datasetmanager-icon.svg", ) ) )
def update_models_completer(self): completer = QCompleter(self.ilicache.model, self.input_line_edit) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setFilterMode(Qt.MatchContains) completer.popup().setItemDelegate(self.model_delegate) self.input_line_edit.setCompleter(completer)