QGIS Ölçüm Aracından mesafeyi mi elde ediyorsunuz?


13

Bir giriş maskesi ile bir Spatialite veritabanı beslemek için bir eklenti oluşturduk. Bir nesnenin min / maks boyutunu temsil eden iki alan vardır.

Ölçme aracını ( iface.actionMeasure().trigger()) iki basma düğmesi "ölçü birimi" ile çağırdığımda, boyutu tıklayın ve klavyemle değeri alanlara (QLineEdit) yazın.

Ölçü Aracı ile sağ tıklamayı (ölçümü bitirmeyi) yaptıktan sonra değerin otomatik olarak alana (min veya maks, QLineEdit) işlenmesi olasılığı var mı?

  1. Çağrı Ölçme Aracı (çalışıyor)
  2. Sol Tıklama: ölçüme başlayın
  3. ve 4. bir kerede: Sağ tıklayın ve Ölçüm Aracı'nın toplam değerini min alanına (QLineEdit) verin.

resim açıklamasını buraya girin

GÜNCELLEME 1:

Bu soruyu sorduktan bir gün sonra bir ölçü aracı (ST_Length (geom)) olarak kullanabileceğim bir linestring katmanına sahip olma fikrim var. Avantajı, ondan veri manipüle etmek ve elde etmek için tam kontrole sahip olmanızdır. Bir dezavantaj, projedeki ek bir katmandır.

Bir iş akışı şunlar olabilir:

  1. tedbiri tıklayın: düzenlemeyi aç / kapat, "Özellik Ekle" yi etkinleştir

  2. Bir nesnenin minimum boyutunu temsil eden linestring oluşturma

  3. Değişiklikleri onaylayın, linestring uzunluğunu hesaplayın (ST_Length (geom)), QLineEdit'e uzunluk koyun

  4. İletişim Kutusunu kapatın ve çizgiyi kaldırın (SİL)

Ama asıl sorum devam ediyor. Mesafe değerini doğrudan Ölçüm Aracı'ndan almanın bir yolu var mı?

Güncelleme 2:

Jakob yardımı ile, Ölçüm Aracını kapatana kadar QLineEdit'imi Ölçüm Aracının Toplam değeri ile güncelleyebilirim . Ardından değer '0,000 m' olarak ayarlanır. Bunu kullanarak bu sorunu çözdüm:

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

Çalışıyor, ama bunun uygun bir çözüm olup olmadığını bilmiyorum.

Yanıtlar:


10
  1. QgsMeasureBase widget'ını bulma
  2. Widget'ta toplam değeri olan QLineEdit'i bulun
  3. QLineEdit textChanged sinyaline bir yuva bağlayın.

Bu kod size yardımcı olacaktır:

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

Demo için ölçülen değerler test adı verilen bir sekmede Günlük Mesajı Paneline yazılır. Bunun yerine min ve max QLineEdit'i güncellersiniz.

resim açıklamasını buraya girin

Aslında kod kısaltılabilir. Yukarıdaki for döngüsü, QgsMeasureBase widget'ının adını bilmiyordum ve 'ölçü' metni için tüm widget'lara bir göz atmak zorunda kaldım.

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
Güzel Cevap, ben programcı değilim ama bu mantığı anlıyorum. Aferin.
Mapperz

'EditTotal' değerini QLineEdit'ime başarıyla bağlayabiliyorum. Ancak QgsMeasureBase iletişim kutusunu kapattığımda değeri (QLineEdit) 0 olarak ayarlanır. İletişim kutusunu kapattığımda bunu nasıl önleyebilirim?
Stefan

QgsMeasureBase iletişim kutusunun tüm alt öğelerini yazdırdığımda: widget_measure = [w for w in QApplication.instance().allWidgets() if w.objectName() == 'QgsMeasureBase'][0]o zaman for i in widget_measure.children(): print i.objectName(), düğmeyi içeren umarım widget 'buttonBox' var QDialogButtonBox.Close. Bu, "yakın tıklandığında editTotal değerini koru veya hiçbir şey yapma" demek için kullanılabilir mi?
Stefan

Sorun, reddetme sinyalinden önce metin değiştirilmiş sinyalin çağrılmasıdır. Şunları ekleyerek test edebilirsiniz: buttonbox = widget_measure.findChild (QDialogButtonBox, 'buttonBox') buttonbox.rejected.connect (buttonbox_rejected) üstteki işlevle: def buttonbox_rejected (): QgsMessageLog.logMessage ('reddedildi', "test")
Jakob

Ölçü uzunluğunu bir dizideki text_changed slotta saklayabilir ve ardından reddetme yuvasında gui için dizide son girilen ikinci değeri seçebilirsiniz.
Jakob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.