Uzyskiwanie odległości od narzędzia pomiarowego QGIS?

13

Zbudowałem wtyczkę do zasilania bazy danych Spatialite za pomocą maski wprowadzania. Istnieją dwa pola reprezentujące minimalny / maksymalny wymiar obiektu.

W momencie, gdy wywołuję narzędzie Measure ( iface.actionMeasure().trigger()) za pomocą dwóch przycisków „miara”, kliknij wymiar i wpisz wartość za pomocą klawiatury w polach (QLineEdit).

Czy istnieje możliwość, że po wykonaniu kliknięcia prawym przyciskiem myszy (zakończenie pomiaru) za pomocą Narzędzia pomiarowego wartość zostanie automatycznie przypisana do pola (min. Lub maks., QLineEdit)?

  1. Narzędzie pomiaru połączeń (działa)
  2. Kliknij lewym przyciskiem: rozpocznij pomiar
  3. oraz 4. naraz: kliknij prawym przyciskiem myszy i zatwierdź całkowitą wartość narzędzia pomiarowego w polu min (QLineEdit).

wprowadź opis zdjęcia tutaj

AKTUALIZACJA 1:

Pewnego dnia po zadaniu tego pytania wpadłem na pomysł, aby mieć warstwę podkładu, której mógłbym użyć jako narzędzia do pomiaru (ST_Length (geom)). Zaletą jest to, że możesz mieć pełną kontrolę nad manipulowaniem i uzyskiwaniem z niego danych. Wadą jest dodatkowa warstwa w projekcie.

Przepływ pracy może być:

  1. pomiar miary: przełącz edycję, aktywuj „Dodaj funkcję”

  2. Utwórz znacznik linii reprezentujący minimalny wymiar obiektu

  3. Potwierdź zmiany, obliczyć długość linii (ST_Length (geom)), zatwierdzić długość do QLineEdit

  4. Zamknij okno dialogowe i usuń oznaczenie linii (USUŃ Z)

Ale moje aktualne pytanie pozostaje. Czy istnieje sposób na uzyskanie wartości odległości bezpośrednio z narzędzia pomiarowego?

Aktualizacja 2:

Z pomocą, jeśli Jakob, mogę zaktualizować mój QLineEdit o Łączną wartość narzędzia pomiarowego, dopóki nie zamknę narzędzia pomiarowego . Następnie wartość jest ustawiana na „0,000 m”. Rozwiązałem ten problem, używając tego:

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

Działa, ale nie wiem, czy to właściwe rozwiązanie.

Stefan
źródło

Odpowiedzi:

10
  1. Znajdź widget QgsMeasureBase
  2. Znajdź QLineEdit z całkowitą wartością w widżecie
  3. Podłącz gniazdo do sygnału textChanged QLineEdit.

Ten kod powinien zacząć:

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

W celu pokazu zmierzone wartości są zapisywane w panelu komunikatów dziennika w zakładce o nazwie test. Zamiast tego aktualizujesz ci min i maks QLineEdit.

wprowadź opis zdjęcia tutaj

W rzeczywistości kod można skrócić. Powyższa pętla for była spowodowana tym, że nie znałem nazwy widżetu QgsMeasureBase i musiałem przyjrzeć się wszystkim widżetom tekstu „miara”.

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
źródło
1
Dobra odpowiedź, nie jestem programistą, ale rozumiem tę logikę. Dobra robota.
Mapperz
Jestem w stanie połączyć wartość „editTotal” z moim QLineEdit. Ale kiedy zamykam okno dialogowe QgsMeasureBase, wartość (QLineEdit) jest ustawiona na 0. Jak mogę tego uniknąć, kiedy zamykam okno dialogowe?
Stefan
Kiedy drukuję wszystkie elementy potomne okna dialogowego QgsMeasureBase za pomocą: widget_measure = [w for w in QApplication.instance().allWidgets() if w.objectName() == 'QgsMeasureBase'][0]wtedy for i in widget_measure.children(): print i.objectName()jest widżet „buttonBox”, który, mam nadzieję, obejmuje przycisk QDialogButtonBox.Close. Czy można to powiedzieć „po kliknięciu przycisku Zamknij zachowaj wartość edytowalną lub nic nie rób”?
Stefan
Problem polega na tym, że sygnał zmieniony tekstem jest wywoływany przed sygnałem odrzucenia. Możesz to przetestować, dodając: buttonbox = widget_measure.findChild (QDialogButtonBox, 'buttonBox') buttonbox.rejected.connect (buttonbox_rejected) z funkcją u góry: def buttonbox_rejected (): QgsMessageLog.logMessage („odrzucony”, „test”)
Jakob
Czy możesz zapisać długość miary w polu tekstowym zmienionym w tablicy, a następnie w polu odrzucania wybierz drugą ostatnią wprowadzoną wartość w tablicy dla ciebie GUI.
Jakob