ได้รับระยะทางจากเครื่องมือวัด QGIS หรือไม่


13

ฉันสร้างปลั๊กอินสำหรับป้อนฐานข้อมูล Spatialite ด้วยรูปแบบการป้อนข้อมูล มีสองฟิลด์ซึ่งแสดงมิติต่ำสุด / สูงสุดของวัตถุ

ในช่วงเวลาที่ฉันเรียกเครื่องมือวัด ( iface.actionMeasure().trigger()) ด้วยปุ่มกด "วัด" สองปุ่มให้คลิกส่วนข้อมูลและพิมพ์ค่าด้วยแป้นพิมพ์ของฉันลงในช่อง (QLineEdit)

มีความเป็นไปได้ไหมที่หลังจากฉันคลิกขวา (เสร็จสิ้นการวัด) ด้วยเครื่องมือวัดค่าจะถูกกำหนดโดยอัตโนมัติไปยังฟิลด์ (ต่ำสุดหรือสูงสุด, QLineEdit)?

  1. เครื่องมือวัดการโทร (ใช้งานได้)
  2. คลิกซ้าย: เริ่มการวัด
  3. และ 4. ในครั้งเดียว: คลิกขวาและยอมรับมูลค่ารวมของเครื่องมือวัดลงในฟิลด์ขั้นต่ำ (QLineEdit)

ป้อนคำอธิบายรูปภาพที่นี่

อัปเดต 1:

วันหนึ่งหลังจากถามคำถามนี้ฉันมีความคิดที่จะมีเลเยอร์ความยาวซึ่งฉันสามารถใช้เป็นเครื่องมือวัด (ST_Length (geom)) ข้อดีคือคุณสามารถควบคุมได้อย่างเต็มที่ในการจัดการและรับข้อมูลจากมัน ข้อเสียคือเลเยอร์เพิ่มเติมในโครงการ

เวิร์กโฟลว์อาจเป็น:

  1. คลิกการวัด: สลับแก้ไขเปิดใช้งาน "เพิ่มคุณสมบัติ"

  2. สร้าง linestring ที่แสดงมิติขั้นต่ำของวัตถุ

  3. ยืนยันการเปลี่ยนแปลงคำนวณความยาวของการคืนความยาว (ST_Length (geom)) ยอมรับความยาวกับ QLineEdit

  4. ปิดกล่องโต้ตอบและลบการคืนค่า (ลบจาก)

แต่คำถามที่แท้จริงของฉันยังคงอยู่ มีวิธีรับค่าระยะทางจากเครื่องมือวัดโดยตรงหรือไม่

อัปเดต 2:

ด้วยความช่วยเหลือถ้าจาคอบฉันสามารถปรับปรุง 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")

สำหรับการสาธิตค่าที่วัดได้จะถูกเขียนไปยังแผงข้อความบันทึกในแท็บที่เรียกว่าการทดสอบ แต่คุณอัปเดตคุณต่ำสุดและสูงสุด QLineEdit

ป้อนคำอธิบายรูปภาพที่นี่

จริงๆแล้วรหัสสามารถย่อให้สั้นลงได้ สำหรับวนรอบด้านบนเป็นเพราะฉันไม่รู้ชื่อของวิดเจ็ต 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ไว้ สิ่งนี้สามารถใช้เพื่อบอกว่า "ถ้าคลิกถูกปิดให้แก้ไขค่ารวมหรือไม่ทำอะไรเลย"?
สเตฟาน

ปัญหาคือสัญญาณ textchanged ถูกเรียกก่อนที่จะปฏิเสธสัญญาณ คุณสามารถทดสอบได้โดยเพิ่ม: buttonbox = widget_measure.findChild (QDialogButtonBox, 'buttonBox') buttonbox.rejected.connect (buttonbox_rejected) พร้อมฟังก์ชั่นด้านบน: def buttonbox_rejected (): QgsMessageLog.logMessage ('ปฏิเสธ', 'ทดสอบ')
Jakob

คุณสามารถเก็บความยาวของการวัดในช่อง text_changed ในอาร์เรย์และจากนั้นในช่องปฏิเสธเลือกค่าที่สองที่ป้อนล่าสุดในอาร์เรย์สำหรับคุณ gui
Jakob
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.