Come ottenere la distanza dallo strumento di misurazione QGIS?


13

Ho creato un plug-in per alimentare un database Spatialite con una maschera di input. Esistono due campi che rappresentano la dimensione min / max di un oggetto.

Nel momento in cui chiamo lo strumento Misura ( iface.actionMeasure().trigger()) con i due pulsanti "misura", faccio clic sulla dimensione e digito il valore con la mia tastiera nei campi (QLineEdit).

Esiste la possibilità che dopo aver fatto clic con il pulsante destro del mouse (Termina misurazione) con lo strumento Misura il valore verrà automaticamente assegnato al campo (min o max, QLineEdit)?

  1. Call Measure Tool (funziona)
  2. Clic sinistro: inizia la misurazione
  3. e 4. subito: fare clic con il pulsante destro del mouse e trasferire il valore totale dello strumento Misura nel campo min (QLineEdit).

inserisci qui la descrizione dell'immagine

AGGIORNAMENTO 1:

Un giorno dopo aver fatto questa domanda ho avuto l'idea di avere un livello di linestring che potrei usare come strumento di misura (ST_Length (geom)). Il vantaggio è che potresti avere il pieno controllo della manipolazione e dell'ottenimento dei dati da esso. Uno svantaggio è un livello aggiuntivo nel progetto.

Un flusso di lavoro potrebbe essere:

  1. misura del clic: attiva / disattiva la modifica, attiva "Aggiungi funzione"

  2. Crea un linestring che rappresenti la dimensione minima di un oggetto

  3. Conferma le modifiche, calcola la lunghezza della stringa lineare (ST_Length (geom)), invia la lunghezza a QLineEdit

  4. Chiudi la finestra di dialogo e rimuovi la stringa di linea (ELIMINA DA)

Ma la mia vera domanda rimane. C'è un modo per ottenere direttamente il valore della distanza dallo strumento di misura?

Aggiornamento 2:

Con l'aiuto di Jakob posso aggiornare il mio QLineEdit con il valore totale dello strumento di misura fino a quando non chiudo lo strumento di misura. Quindi il valore è impostato su '0.000 m'. Ho risolto questo problema usando questo:

def text_changed(str_measure):
    if str_measure == '0,000 m':
        pass
    else:
        self.min.setText(str_measure)

Funziona, ma non so se questa sia una soluzione adeguata.

Risposte:


10
  1. Trova il widget QgsMeasureBase
  2. Trova QLineEdit con il valore totale nel widget
  3. Collegare uno slot al segnale textLhanged di QLineEdit.

Questo codice dovrebbe iniziare:

def text_changed(str_measure):
        QgsMessageLog.logMessage(str_measure, "test")

from qgis.core import QgsMessageLog
from PyQt4.QtGui import QApplication, QLineEdit
from PyQt4.QtCore import pyqtSignal

QgsMessageLog.logMessage("start", "test")

for w in QApplication.instance().allWidgets():
    name = w.objectName()
    if name == 'QgsMeasureBase':
        QgsMessageLog.logMessage(name, "test")

        lineedit = w.findChild(QLineEdit, 'editTotal')
        QgsMessageLog.logMessage('Text: {}'.format(lineedit.text()),'test')

        #{object}.{signal}.connect({slot})
        lineedit.textChanged.connect(text_changed) 
        break

QgsMessageLog.logMessage("stop", "test")
QgsMessageLog.logMessage("", "test")

Per la demo, i valori misurati vengono scritti nel pannello dei messaggi di registro in una scheda denominata test. Invece aggiorni QLineEdit min e max.

inserisci qui la descrizione dell'immagine

In realtà il codice può essere abbreviato. Il ciclo for sopra era perché non conoscevo il nome del widget QgsMeasureBase e dovevo dare un'occhiata a tutti i widget per il testo 'misura'.

def text_changed(str_measure):
    QgsMessageLog.logMessage(str_measure, "test")

from qgis.core import QgsMessageLog
from PyQt4.QtGui import QApplication, QLineEdit
from PyQt4.QtCore import pyqtSignal

QgsMessageLog.logMessage("---start---", "test")

widget_measure = [w for w in QApplication.instance().allWidgets() if w.objectName() == 'QgsMeasureBase'][0]
lineedit = widget_measure.findChild(QLineEdit, 'editTotal')
lineedit.textChanged.connect(text_changed) 

QgsMessageLog.logMessage('Text: {}'.format(lineedit.text()),'test')

QgsMessageLog.logMessage("---stop---", "test")

1
Bella risposta, non sono un programmatore ma capisco questa logica. Molto bene.
Mapperz

Sono in grado di collegare correttamente il valore 'editTotal' al mio QLineEdit. Ma quando chiudo la finestra di dialogo QgsMeasureBase il valore (QLineEdit) è impostato su 0. Come posso evitare questo quando chiudo la finestra di dialogo?
Stefan,

Quando stampo tutti i figli della finestra di dialogo QgsMeasureBase con: widget_measure = [w for w in QApplication.instance().allWidgets() if w.objectName() == 'QgsMeasureBase'][0]quindi for i in widget_measure.children(): print i.objectName(), c'è il widget 'buttonBox', che spero includa il pulsante QDialogButtonBox.Close. Può essere usato per dire "se si fa clic su Chiudi, mantenere il valore totale o non fare nulla"?
Stefan,

Il problema è che il segnale modificato viene chiamato prima del segnale di rifiuto. Puoi testarlo aggiungendo: buttonbox = widget_measure.findChild (QDialogButtonBox, 'buttonBox') buttonbox.rejected.connect (buttonbox_rejected) con la funzione in alto: def buttonbox_rejected (): QgsMessageLog.logMessage ('rifiutato', "test")
Jakob,

Riesci a memorizzare la lunghezza della misura nello slot text_changed in un array e quindi nello slot di rifiuto selezionare il secondo ultimo valore immesso nell'array per te gui.
Jakob,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.