Отримання відстані від засобу вимірювання QGIS?


13

Я створив плагін для живлення бази даних Spatialite з маскою введення. Є два поля, які представляють мін / максимальний розмір об'єкта.

У той момент, коли я закликаю інструмент вимірювання ( iface.actionMeasure().trigger()) двома кнопковими кнопками "міряти", клацніть розмірність і введіть значення за допомогою моєї клавіатури в поля (QLineEdit).

Чи існує можливість, що після того, як я натискаю правою кнопкою миші (закінчую вимірювання) за допомогою інструменту вимірювання, значення буде автоматично введене в поле (min або max, QLineEdit)?

  1. Засіб виклику заходів (працює)
  2. Клацніть лівою кнопкою миші: починайте вимірювання
  3. і 4. відразу: клацніть правою кнопкою миші та введіть загальне значення інструменту вимірювання у поле min (QLineEdit).

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

ОНОВЛЕННЯ 1:

Одного разу після того, як задати це питання, у мене з’явилася ідея мати шар рядків рядків, який я міг би використовувати як інструмент вимірювання (ST_Length (geom)). Перевага полягає в тому, що ви могли мати повний контроль над маніпулюванням та отриманням даних. Недоліком є ​​додатковий шар у проекті.

Робочий процес може бути:

  1. міра натискання: перемикання редагування, активація "Додати функцію"

  2. Створіть рядковий рядок, який представляє мінімальний розмір об'єкта

  3. Підтвердити зміни, обчислити довжину рядкового рядка (ST_Length (geom)), докласти довжину до QLineEdit

  4. Закрити діалогове вікно та видалити рядок (ВИДАЛИТИ ВІД)

Але моє актуальне питання залишається. Чи є спосіб отримати значення відстані безпосередньо від інструменту вимірювання?

Оновлення 2:

За допомогою, якщо Якоб я можу оновити свій QLineEdit на загальне значення інструменту вимірювання, поки не закрию інструмент вимірювання. Тоді значення встановлюється "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")

Для демонстрації виміряні значення записуються на панель повідомлень журналу на вкладці під назвою тест. Замість цього ви оновлюєте мінімум та максимум QLineEdit.

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

Насправді код можна скоротити. Цикл for був вище, тому що я не знав імені віджета QgsMeasureBase, і мені довелося переглянути всі віджети для тексту "міра".

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

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. Чи можна це використовувати для того, щоб сказати, "якщо натиснути" Закрити ", зберегти значення editTotal або нічого не робити"?
Стефан

Проблема полягає в тому, що змінений текст викликається перед сигналом відхилення. Ви можете перевірити його, додавши: buttonbox = widget_measure.findChild (QDialogButtonBox, 'buttonBox') buttonbox.rejected.connect (buttonbox_rejected) з функцією вгорі: def buttonbox_rejected (): QgsMessageLog.logMessage ('відхилено', "тест")
Якоб

Чи можете ви зберегти довжину вимірювання в слоті text_changed в масиві, а потім на слоті для відхилення виберіть друге останнє введене значення в масиві для вас gui.
Якоб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.