Memperoleh jarak dari Alat Ukur QGIS?

13

Saya telah membangun sebuah plugin untuk memberi makan basis data Spatialite dengan masker input. Ada dua bidang yang mewakili dimensi min / maks suatu objek.

Pada saat saya memanggil Measure Tool ( iface.actionMeasure().trigger()) dengan dua Push Buttons "ukur", klik dimensi dan ketik nilainya dengan keyboard saya ke dalam bidang (QLineEdit).

Apakah ada kemungkinan bahwa setelah saya melakukan klik kanan (selesai mengukur) dengan Alat Ukur nilai akan secara otomatis berkomitmen ke bidang (min atau maks, QLineEdit)?

  1. Alat Ukur Panggilan (berfungsi)
  2. Klik Kiri: mulai mengukur
  3. dan 4. sekaligus: Klik kanan dan komit Nilai total Alat Ukur ke bidang min (QLineEdit).

masukkan deskripsi gambar di sini

PEMBARUAN 1:

Suatu hari setelah mengajukan pertanyaan ini saya mendapat ide untuk memiliki lapisan linestring yang dapat saya gunakan sebagai alat ukur (ST_Length (geom)). Keuntungannya adalah Anda bisa memiliki kontrol penuh untuk memanipulasi dan mendapatkan data darinya. Kerugiannya adalah lapisan tambahan dalam proyek.

Alur kerja dapat:

  1. klik ukur: beralih pengeditan, aktifkan "Tambahkan Fitur"

  2. Buat linestring yang mewakili dimensi min dari suatu objek

  3. Konfirmasikan perubahan, hitung panjang linestring (ST_Length (geom)), komit panjang ke QLineEdit

  4. Tutup Dialog dan hapus linestring (DELETE FROM)

Tapi pertanyaan saya yang sebenarnya tetap ada. Apakah ada cara untuk mendapatkan nilai jarak dari Alat Ukur secara langsung?

Pembaruan 2:

Dengan bantuan jika Jakob saya dapat memperbarui QLineEdit saya dengan nilai Total Alat Ukur sampai saya menutup Alat Ukur. Kemudian nilainya diatur ke '0,000 m'. Saya memecahkan masalah ini dengan menggunakan ini:

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

Ini bekerja, tetapi saya tidak tahu apakah ini solusi yang tepat.

Stefan
sumber

Jawaban:

10
  1. Temukan widget QgsMeasureBase
  2. Temukan QLineEdit dengan nilai total di widget
  3. Hubungkan slot ke sinyal QLineEdit textChanged.

Kode ini akan membantu Anda:

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

Untuk demo, nilai yang diukur ditulis ke Log Message Panel di tab yang disebut test. Alih-alih Anda memperbarui min dan maks QLineEdit Anda.

masukkan deskripsi gambar di sini

Sebenarnya kodenya bisa dipersingkat. Untuk loop di atas adalah karena saya tidak tahu nama widget QgsMeasureBase, dan harus melihat semua widget untuk teks 'ukuran'.

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
sumber
1
Jawaban Bagus, saya bukan seorang programmer tetapi saya mengerti logika ini. Sudah selesai dilakukan dengan baik.
Mapperz
Saya dapat menghubungkan nilai 'editTotal' ke QLineEdit saya, berhasil. Tetapi ketika saya menutup dialog QgsMeasureBase nilai (QLineEdit) diatur ke 0. Bagaimana saya bisa menghindari ini ketika saya menutup dialog?
Stefan
Ketika saya mencetak semua anak dari dialog QgsMeasureBase dengan: widget_measure = [w for w in QApplication.instance().allWidgets() if w.objectName() == 'QgsMeasureBase'][0]lalu for i in widget_measure.children(): print i.objectName(), ada widget 'buttonBox', yang saya harap menyertakan tombol QDialogButtonBox.Close. Apakah ini dapat digunakan untuk mengatakan "jika tutup diklik menjaga nilai editTotal atau tidak melakukan apa-apa"?
Stefan
Masalahnya adalah sinyal yang diganti teks dipanggil sebelum sinyal ditolak. Anda dapat mengujinya dengan menambahkan: buttonbox = widget_measure.findChild (QDialogButtonBox, 'buttonBox') buttonbox.rejected.connect (buttonbox_rejected) dengan fungsi di atas: def buttonbox_rejected (): QgsMessageLog.logMessage ('ditolak', "test") "
Jakob
Bisakah Anda menyimpan ukuran panjang dalam slot text_changed dalam array dan kemudian pada slot tolak mengambil nilai kedua yang dimasukkan terakhir dalam array untuk Anda gui.
Jakob