¿Cómo obtener la distancia de 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 "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 la medición) con la herramienta de medición, el valor se confirme automáticamente en el campo (mínimo o máximo, QLineEdit)?

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

ingrese la descripción de la imagen aquí

ACTUALIZACIÓN 1:

Un día después de hacer esta pregunta, tuve la idea de tener una capa de cadena lineal que podría usar como herramienta de medida (ST_Length (geom)). La ventaja es que podría tener el control total de manipular y obtener datos de él. Una desventaja es una capa adicional en el proyecto.

Un flujo de trabajo podría ser:

  1. medida de clic: alternar la edición, activar "Agregar función"

  2. Crear una cadena lineal 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 a QLineEdit

  4. Cerrar el cuadro de diálogo y eliminar la cadena de línea (DELETE FROM)

Pero mi pregunta real sigue siendo. ¿Hay alguna manera de obtener el valor de distancia directamente desde la herramienta de medición?

Actualización 2:

Con la ayuda de 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.

Stefan
fuente

Respuestas:

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 QLineEdit textChanged.

Este código debería ayudarlo:

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, actualiza su QLineEdit mínimo y máximo.

ingrese la descripción de la imagen aquí

En realidad, el código puede acortarse. El bucle anterior se debió a que no sabía el nombre del widget QgsMeasureBase y tuve que echar un vistazo a todos los widgets para el texto "medida".

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")
Jakob
fuente
1
Buena respuesta, no soy un programador pero entiendo esta lógica. Bien hecho.
Mapperz
Puedo conectar el valor 'editTotal' a mi QLineEdit, con éxito. Pero cuando cierro el cuadro de diálogo QgsMeasureBase, el valor (QLineEdit) se establece en 0. ¿Cómo puedo evitar esto cuando cierro el cuadro de diálogo?
Stefan
Cuando imprimo todos los elementos secundarios del cuadro de diálogo QgsMeasureBase con: widget_measure = [w for w in QApplication.instance().allWidgets() if w.objectName() == 'QgsMeasureBase'][0]entonces for i in widget_measure.children(): print i.objectName(), está el widget 'buttonBox', que espero incluya el botón QDialogButtonBox.Close. ¿Se puede usar esto para decir "si se hace clic en cerrar, mantenga el valor de edición total o no haga nada"?
Stefan
El problema es que se llama a la señal de cambio de texto antes de la señal de rechazo. Puede probarlo agregando: buttonbox = widget_measure.findChild (QDialogButtonBox, 'buttonBox') buttonbox.rejected.connect (buttonbox_rejected) con la función en la parte superior: def buttonbox_rejected (): QgsMessageLog.logMessage ('jected ', "test")
Jakob
¿Puede almacenar la longitud de la medida en la ranura text_changed en una matriz y luego, en la ranura de rechazo, elija el segundo último valor ingresado en la matriz para su interfaz gráfica de usuario?
Jakob