Получение расстояния от инструмента измерения QGIS?

13

Я создал плагин для подачи базы данных Spatialite с маской ввода. Есть два поля, которые представляют минимальное / максимальное измерение объекта.

В тот момент, когда я вызываю Measure Tool ( iface.actionMeasure().trigger()) с двумя кнопками «measure», щелкните по измерению и введите значение с помощью клавиатуры в поля (QLineEdit).

Существует ли вероятность того, что после того, как я сделаю правый щелчок (закончить измерение) с помощью инструмента измерения, значение будет автоматически зафиксировано в поле (min или max, QLineEdit)?

  1. Call Measure Tool (работает)
  2. Левый щелчок: начать измерение
  3. и 4. сразу: щелкните правой кнопкой мыши и передайте Общее значение Measure Tool в поле min (QLineEdit).

введите описание изображения здесь

ОБНОВЛЕНИЕ 1:

Однажды после того, как я задал этот вопрос, у меня появилась идея создать слой линейных линий, который я мог бы использовать в качестве инструмента измерения (ST_Length (geom)). Преимущество в том, что вы можете иметь полный контроль над манипулированием и получением данных из него. Недостатком является дополнительный слой в проекте.

Рабочий процесс может быть:

  1. нажмите меру: переключить редактирование, активировать «Добавить функцию»

  2. Создайте линейную строку, которая представляет минимальное измерение объекта

  3. Подтвердите изменения, вычислите длину строки (ST_Length (geom)), передайте длину в QLineEdit

  4. Закройте диалог и удалите строку строки (УДАЛИТЬ ИЗ)

Но мой актуальный вопрос остается. Есть ли способ получить значение расстояния непосредственно из инструмента измерения?

Обновление 2:

С помощью Jakob я могу обновить свой QLineEdit с помощью Total Value инструмента Measure, пока я не закрою инструмент Measure. Затем значение устанавливается на «0,000 м». Я решил эту проблему с помощью этого:

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

Это работает, но я не знаю, является ли это правильным решением.

Стефан
источник

Ответы:

10
  1. Найти виджет QgsMeasureBase
  2. Найдите QLineEdit с общим значением в виджете
  3. Подключите слот к сигналу QLineEdit textChanged.

Этот код должен помочь вам:

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

Для демонстрации измеренные значения записываются в панель сообщений журнала на вкладке под названием test. Вместо этого вы обновляете свои минимальные и максимальные значения QLineEdit.

введите описание изображения здесь

На самом деле код может быть сокращен. Цикл for выше был из-за того, что я не знал имени виджета QgsMeasureBase, и мне пришлось взглянуть на все виджеты для текста 'measure'.

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
источник
1
Хороший ответ, я не программист, но я понимаю эту логику. Отлично сработано.
Mapperz
Я могу успешно подключить значение editTotal к моему QLineEdit. Но когда я закрываю диалоговое окно QgsMeasureBase, значение (QLineEdit) устанавливается равным 0. Как я могу избежать этого при закрытии диалога?
Стефан
Когда я печатаю все дочерние элементы диалогового окна QgsMeasureBase с помощью: widget_measure = [w for w in QApplication.instance().allWidgets() if w.objectName() == 'QgsMeasureBase'][0]затем for i in widget_measure.children(): print i.objectName(), появляется виджет 'buttonBox', который, я надеюсь, включает кнопку QDialogButtonBox.Close. Можно ли это использовать, чтобы сказать «если щелкнуть по кнопке close, сохранить значение editTotal или ничего не делать»?
Стефан
Проблема в том, что текстовый сигнал вызывается до сигнала отклонения. Вы можете проверить это, добавив: buttonbox = widget_measure.findChild (QDialogButtonBox, 'buttonBox') buttonbox.rejected.connect (buttonbox_rejected) с функцией сверху: def buttonbox_rejected (): QgsMessageLog.logMessage ('rejected', "test")
Якоб
Вы можете сохранить меру длины в слоте text_changed в массиве, а затем в слоте отклонения выбрать второе последнее введенное значение в массиве для вашего графического интерфейса.
Якоб