QGIS Measure Toolから距離を取得していますか?


13

入力マスクを使用してSpatialiteデータベースにフィードするプラグインを作成しました。オブジェクトの最小/最大次元を表す2つのフィールドがあります。

iface.actionMeasure().trigger()2つのプッシュボタン「メジャー」でメジャーツール()を呼び出した瞬間に、寸法をクリックし、キーボードでフィールドに値を入力します(QLineEdit)。

測定ツールで右クリック(測定の終了)を行った後、値が自動的にフィールド(最小または最大、QLineEdit)にコミットされる可能性はありますか?

  1. 測定ツールの呼び出し(動作します)
  2. 左クリック:測定を開始
  3. 4.一度に:右クリックして、測定ツールの合計値を最小フィールド(QLineEdit)にコミットします。

ここに画像の説明を入力してください

更新1:

この質問をしたある日、メジャーツール(ST_Length(geom))として使用できるラインストリングレイヤーを作成するというアイデアを思いつきました。利点は、そこからデータを操作および取得することを完全に制御できることです。短所は、プロジェクトに追加の層があることです。

ワークフローは次のとおりです。

  1. 測定をクリック:編集を切り替え、「機能を追加」を有効にします

  2. オブジェクトの最小寸法を表す線ストリングを作成します

  3. 変更の確認、ラインストリングの長さの計算(ST_Length(geom))、QLineEditへの長さのコミット

  4. ダイアログを閉じてラインストリングを削除(DELETE FROM)

しかし、私の実際の質問は残っています。測定ツールから直接距離値を取得する方法はありますか?

アップデート2:

Jakobの助けを借りて、Measure Tool を閉じるまで、Measure ToolのTotal値で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を更新します。

ここに画像の説明を入力してください

実際、コードは短縮できます。上記の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
いい答えです。私はプログラマーではありませんが、この論理は理解しています。よくやった。
マッパーズ

「editTotal」値をQLineEditに正常に接続できます。しかし、QgsMeasureBaseダイアログを閉じると、値(QLineEdit)は0に設定されます。ダイアログを閉じるときにこれを回避するにはどうすればよいですか?
ステファン

QgsMeasureBaseダイアログのすべての子を次のように印刷する場合:widget_measure = [w for w in QApplication.instance().allWidgets() if w.objectName() == 'QgsMeasureBase'][0]then for i in widget_measure.children(): print i.objectName()、ウィジェット 'buttonBox'があり、buttonを含めることを望みますQDialogButtonBox.Close。これを使用して、「閉じるをクリックした場合、editTotal値を保持するか、何もしない」と言うことができますか?
ステファン

問題は、リジェクト信号の前にtextchanged信号が呼び出されることです。以下を追加することでテストできます:buttonbox = widget_measure.findChild(QDialogBu​​ttonBox、 'buttonBox')buttonbox.rejected.connect(buttonbox_rejected)上の関数:def buttonbox_rejected():QgsMessageLog.logMessage( 'rejected'、 "test")
ヤコブ

配列のtext_changedスロットに測定長を保存し、拒否スロットで配列の最後から2番目に入力した値を選択してください。
ヤコブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.