¿Obtener la distancia desde la herramienta de medición QGIS?

13

He creado un complemento para alimentar una base de datos Spatialite con una máscara de entrada. Hay dos campos que representan la dimensión mínima / máxima de un objeto.

En el momento en que llamo a la herramienta Medir ( iface.actionMeasure().trigger() ) con los dos Botones de presión "medir", haga clic en la dimensión y escriba el valor con mi teclado en los campos (QLineEdit).

¿Existe la posibilidad de que después de hacer clic con el botón derecho (terminar de medir) con la herramienta de medición, el valor se confirme automáticamente en el campo (mínimo o máximo, QLineEdit)?

  1. Herramienta de medición de llamadas (funciona)
  2. clic izquierdo: comenzar a medir
  3. y 4. a la vez: haga clic con el botón derecho y confirme el valor total de la herramienta Medir en el campo min (QLineEdit).

ACTUALIZACIÓN1:

Undíadespuésdehacerestapregunta,tengolaideadetenerunacapadecadenadelíneasquepuedausarcomoherramientademedición(ST_Length(geom)).Laventajaesquepodríatenerelcontroltotaldelamanipulaciónylaobtencióndedatosdeeste.Unadesventajaesunacapaadicionalenelproyecto.

Unflujodetrabajopodríaser:

  1. hagaclicenlamedida:cambielaedición,active"Agregar función"

  2. Crear una cadena de líneas que represente la dimensión mínima de un objeto

  3. Confirme los cambios, calcule la longitud de la cadena lineal (ST_Length (geom)), confirme la longitud en QLineEdit

  4. Cierre el cuadro de diálogo y elimine la cadena de líneas (DELETE FROM)

Pero mi pregunta actual permanece. ¿Hay alguna forma de obtener el valor de la distancia directamente desde la Herramienta de medición?

Actualización 2:

Con la ayuda, si Jakob puedo actualizar mi QLineEdit con el valor total de la herramienta de medición hasta que cierre la herramienta de medición. Entonces el valor se establece en '0,000 m'. Resolví este problema usando esto:

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

Funciona, pero no sé si esta es una solución adecuada.

    
pregunta Stefan 25.04.2017 - 15:19

1 respuesta

10
  1. Encuentra el widget QgsMeasureBase
  2. Encuentre el QLineEdit con el valor total en el widget
  3. Conecte una ranura a la señal de cambio de texto de QLineEdit.

Este código debería hacerte funcionar:

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")

Para la demostración, los valores medidos se escriben en el Panel de mensajes de registro en una pestaña llamada prueba. En su lugar, actualizas tu mínimo y máximo QLineEdit.

Enrealidad,elcódigosepuedeacortar.ElbucleforanteriorfueporquenosabíaelnombredelwidgetQgsMeasureBase,ytuvequeecharunvistazoatodosloswidgetsparaeltexto'medida'.

deftext_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")
    
respondido por el Jakob 03.05.2017 - 14:13

Lea otras preguntas en las etiquetas