是否从QGIS测量工具获得距离?


13

我已经建立了一个插件来为Spatialite数据库提供输入掩码。有两个字段代表对象的最小/最大尺寸。

当我iface.actionMeasure().trigger()用两个按钮“ Measure” 调用“测量工具”()时,单击尺寸,然后用键盘将值键入字段(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的Total值更新QLineEdit,直到关闭Measure Tool。然后将该值设置为“ 0,000 m”。我通过使用以下方法解决了这个问题:

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

它可以工作,但是我不知道这是否是正确的解决方案。

Answers:


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
不错的答案,我不是程序员,但我理解这种逻辑。做得好。
Mapperz

我能够将'editTotal'值成功连接到我的QLineEdit。但是,当我关闭QgsMeasureBase对话框时,值(QLineEdit)设置为0。如何在关闭对话框时避免这种情况?
Stefan's

当我使用以下命令打印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”,我希望其中不包括button QDialogButtonBox.Close。可以用来说“如果单击关闭保持editTotal值或什么都不做”?
Stefan

问题在于,被替换的信号在拒绝信号之前被调用。您可以通过添加以下内容进行测试:buttonbox = widget_measure.findChild(QDialogBu​​ttonBox,'buttonBox')buttonbox.rejected.connect(buttonbox_rejected),其顶部位于该函数中:def buttonbox_rejected():QgsMessageLog.logMessage('rejected',“ test”)
雅各布

您可以将测量长度存储在数组的text_changed插槽中,然后在拒绝插槽中为gui选择数组中倒数第二个输入的值。
雅各布
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.