QGIS 측정 도구에서 거리를 구합니까?


13

Spatialite 데이터베이스에 입력 마스크를 공급하기위한 플러그인을 만들었습니다. 객체의 최소 / 최대 치수를 나타내는 두 개의 필드가 있습니다.

iface.actionMeasure().trigger()두 개의 푸시 버튼 "측정"을 사용 하여 측정 도구 ( )를 호출하는 순간 치수를 클릭하고 키보드로 값을 필드 (QLineEdit)에 입력하십시오.

측정 도구를 사용하여 마우스 오른쪽 버튼을 클릭 한 후 (마무리 측정) 값이 필드 (최소 또는 최대, QLineEdit)에 자동으로 커밋 될 가능성이 있습니까?

  1. 통화 측정 도구 (작동)
  2. 왼쪽 클릭 : 측정 시작
  3. 4. 한 번에 : 마우스 오른쪽 버튼을 클릭하고 측정 도구의 총 값을 최소 필드 (QLineEdit)에 커밋합니다.

여기에 이미지 설명을 입력하십시오

업데이트 1 :

이 질문을 한 후 어느 날 나는 측정 도구 (ST_Length (geom))로 사용할 수있는 선 스트링 레이어를 갖는 아이디어를 얻었습니다. 장점은 데이터를 조작하고 데이터를 얻는 것을 완전히 제어 할 수 있다는 것입니다. 단점은 프로젝트의 추가 계층입니다.

워크 플로우는 다음과 같습니다.

  1. 클릭 측정 : 편집 토글, "기능 추가"활성화

  2. 객체의 최소 치수를 나타내는 선 스트링 만들기

  3. 변경 사항 확인, 라인 스트링 길이 계산 (ST_Length (geom)), QLineEdit에 커밋 길이

  4. 대화 상자를 닫고 줄 문자열을 제거하십시오 (DELETE FROM)

그러나 내 실제 질문은 남아 있습니다. 측정 도구에서 직접 거리 값을 얻는 방법이 있습니까?

업데이트 2 :

Jakob의 도움으로 측정 도구를 닫을 때까지 QLineEdit을 측정 도구의 총 값으로 업데이트 할 수 있습니다 . 그런 다음 값은 '0,000 m'으로 설정됩니다. 나는 이것을 사용 하여이 문제를 해결했다.

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

1
좋은 대답, 저는 프로그래머는 아니지만이 논리를 이해합니다. 잘 했어.
Mapperz

'editTotal'값을 QLineEdit에 성공적으로 연결할 수 있습니다. 그러나 QgsMeasureBase 대화 상자를 닫으면 값 (QLineEdit)이 0으로 설정됩니다. 대화 상자를 닫을 때이를 피하려면 어떻게해야합니까?
Stefan

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 값 유지 또는 아무것도 수행하지 않음"이라고 말하는 데 사용할 수 있습니까?
Stefan

문제는 텍스트 변경 신호가 거부 신호 전에 호출된다는 것입니다. 다음을 추가하여 테스트 할 수 있습니다. buttonbox = widget_measure.findChild (QDialogButtonBox, 'buttonBox') buttonbox.rejected.connect (buttonbox_rejected) 상단에 함수 포함
Jakob

측정 길이를 배열의 text_changed 슬롯에 저장 한 다음 거부 슬롯에서 배열에서 마지막으로 입력 한 두 번째 값을 GUI에 선택할 수 있습니다.
Jakob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.