Abrufen der Entfernung vom QGIS Measure Tool?

13

Ich habe ein Plugin zum Füttern einer Spatialite-Datenbank mit einer Eingabemaske erstellt. Es gibt zwei Felder, die die Min / Max-Dimension eines Objekts darstellen.

In dem Moment, in dem ich das Measure Tool ( iface.actionMeasure().trigger()) mit den beiden Push Buttons "measure" aufrufe, klicke ich auf die Bemaßung und tippe den Wert mit meiner Tastatur in die Felder (QLineEdit).

Gibt es die Möglichkeit, dass nach dem Klicken mit der rechten Maustaste (Messung beenden) mit dem Measure Tool der Wert automatisch in das Feld übernommen wird (min oder max, QLineEdit)?

  1. Call Measure Tool (es funktioniert)
  2. Linksklick: Messung starten
  3. und 4. sofort: Klicken Sie mit der rechten Maustaste und übertragen Sie den Gesamtwert des Measure Tools in das Feld min (QLineEdit).

Bildbeschreibung hier eingeben

UPDATE 1:

Eines Tages, nachdem ich diese Frage gestellt hatte, kam mir die Idee, eine Linienfolge-Ebene zu erstellen, die ich als Messwerkzeug verwenden könnte (ST_Length (geom)). Der Vorteil ist, dass Sie die volle Kontrolle über die Manipulation und das Abrufen von Daten haben können. Ein Nachteil ist eine zusätzliche Ebene im Projekt.

Ein Workflow könnte sein:

  1. Klickmaß: Bearbeitung umschalten, "Feature hinzufügen" aktivieren

  2. Erstellen Sie eine Linienfolge, die die minimale Dimension eines Objekts darstellt

  3. Bestätigen Sie die Änderungen, berechnen Sie die Länge der Linienfolge (ST_Length (geom)) und übergeben Sie die Länge an QLineEdit

  4. Schließen Sie den Dialog und entfernen Sie die Linienfolge (ENTFERNEN VON)

Aber meine eigentliche Frage bleibt. Gibt es eine Möglichkeit, den Entfernungswert direkt aus dem Messwerkzeug zu ermitteln?

Update 2:

Mit der Hilfe von Jakob kann ich mein QLineEdit mit dem Gesamtwert des Measure Tools aktualisieren, bis ich das Measure Tool schließe. Dann wird der Wert auf '0,000 m' gesetzt. Ich habe dieses Problem folgendermaßen gelöst:

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

Es funktioniert, aber ich weiß nicht, ob dies eine richtige Lösung ist.

Stefan
quelle

Antworten:

10
  1. Finden Sie das QgsMeasureBase-Widget
  2. Finden Sie das QLineEdit mit dem Gesamtwert im Widget
  3. Verbinden Sie einen Steckplatz mit dem QLineEdit-Signal textChanged.

Dieser Code soll Sie zum Laufen bringen:

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

Für die Demo werden die gemessenen Werte in einer Registerkarte namens test in das Log Message Panel geschrieben. Stattdessen aktualisieren Sie Ihr min und max QLineEdit.

Bildbeschreibung hier eingeben

Eigentlich kann der Code gekürzt werden. Die obige for-Schleife war, weil ich den Namen des QgsMeasureBase-Widgets nicht kannte und mir alle Widgets für den Text 'measure' ansehen musste.

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
quelle
1
Gute Antwort, ich bin kein Programmierer, aber ich verstehe diese Logik. Gut gemacht.
Mapperz
Ich kann den Wert 'editTotal' erfolgreich mit meinem QLineEdit verbinden. Wenn ich das Dialogfeld "QgsMeasureBase" schließe, wird der Wert (QLineEdit) auf 0 gesetzt. Wie kann ich dies vermeiden, wenn ich das Dialogfeld schließe?
Stefan
Als ich mit allen Kindern des QgsMeasureBase Dialogs drucken: widget_measure = [w for w in QApplication.instance().allWidgets() if w.objectName() == 'QgsMeasureBase'][0]dann for i in widget_measure.children(): print i.objectName()gibt es das Widget ‚buttonBox‘, die ich encludes die Taste hoffen QDialogButtonBox.Close. Kann dies verwendet werden, um zu sagen, dass "wenn auf Schließen geklickt wird, editTotal-Wert beibehalten oder nichts unternommen wird"?
Stefan
Das Problem ist, dass das textveränderte Signal vor dem Zurückweisungssignal aufgerufen wird. Sie können es testen, indem Sie hinzufügen: buttonbox = widget_measure.findChild (QDialogButtonBox, 'buttonBox') buttonbox.rejected.connect (buttonbox_rejected) mit der Funktion oben: def buttonbox_rejected (): QgsMessageLog.logMessage ('reject', "test")
Jakob
Können Sie die Measure-Länge in text_changed slot in einem Array speichern und dann auf dem Reject-Slot den zweitletzten eingegebenen Wert im Array für Sie auswählen?
Jakob