Programla PyQGIS'de fare tıklaması olup olmadığını kontrol et?


19

QGIS'de fare tıklatmasını nasıl kontrol edeceğinizi bilmek istiyorum. Bir python eklentisi yazmaya çalışıyorum ve zaten QGIS'de bulunan "Tek Özellik Seç" aracına benzer işlevsellik sağlamak istiyorum.

QGIS api belgelerini kontrol ettim ve buldum

QgsMapCanvas::CanvasProperties::mouseButtonDown

Kulağa umut verici geliyor. Bir QgsMapCanvas nesnesi var ama mouseButtonDown özniteliğine erişmek nasıl göremiyorum.

QGIS API için tamamen yeniyim.

Yanıtlar:


23

Tek Unsur Seçin aracı gibi yeni bir araç yapmanın en iyi yolu QgsMapToolsınıftan miras almaktır . Aracınız kullanılarak ayarlanabilen etkin olduğunda, QgsMapCanvas::setMapTooltuvalin aldığı tüm klavye veya tıklama olayları özel aracınıza aktarılır.

İşte temel bir QgsMapToolsınıf

class PointTool(QgsMapTool):   
    def __init__(self, canvas):
        QgsMapTool.__init__(self, canvas)
        self.canvas = canvas    

    def canvasPressEvent(self, event):
        pass

    def canvasMoveEvent(self, event):
        x = event.pos().x()
        y = event.pos().y()

        point = self.canvas.getCoordinateTransform().toMapCoordinates(x, y)

    def canvasReleaseEvent(self, event):
        #Get the click
        x = event.pos().x()
        y = event.pos().y()

        point = self.canvas.getCoordinateTransform().toMapCoordinates(x, y)

    def activate(self):
        pass

    def deactivate(self):
        pass

    def isZoomTool(self):
        return False

    def isTransient(self):
        return False

    def isEditTool(self):
        return True

İhtiyacınız olanı yapabilirsiniz canvasReleaseEvent, vb.

Bu aracı etkinleştirmek için yapmanız gerekenler:

tool = PointTool(qgis.iface.mapCanvas())
qgis.iface.mapCanvas().setMapTool(tool)

Cevabınız için teşekkürler. Tam olarak ihtiyacım olan şey. Ben bu çözüm uygulama deneyin Ancak, aşağıdaki hatayı alıyorum: class PointTool(QgsMapTool): NameError: name 'QgsMapTool' is not defined. Herhangi bir fikir?
Robert

1
En from qgis.gui import QgsMapToolüstte kullanmanız gerekecek
Nathan W

Son soru ... Bu aracı nasıl devre dışı bırakabilirsiniz?
robert

Maptool'u başka bir şeye veya konumuna ayarlayın None. QgsMapCanvas.mapTool()Tamamlandıktan sonra geri yükleyerek kullanarak kullanıcının seçtiklerini kaydederdim.
Nathan W

@NathanW "Maptool'u başka bir şeye ayarlamak" da araç çubuğundaki 'Haritayı Kaydır'ı tıkladığım anlamına gelir, değil mi?
wannik

3

Ben bunu cevap ile başa çıkmak için QGIS "canvasClicked" ama aynı zamanda SIGNAL / SLOTS kullanarak bir kombinasyon ile yapabilirsiniz düşünüyorum:

result = QObject.connect(self.clickTool, SIGNAL("canvasClicked(const QgsPoint &, Qt::MouseButton)"), self.handleMouseDown)

Denenmedi, ancak bakmaya başlamak için biraz daha bilgi vermelisin. Orada burada bir öğretici birisi çok temel bir eklenti oluşturmak için bu kullanıyor.


1
QgsMapToolEmitPointBir araç için temel bir başlangıç ​​sağlayacak olan yerleşik sınıfı kullanıyorlar . PyQt'taki sinyallere bağlanmanın iyi bir yolu bu sözdizimini kullanmaktırself.clickTool.canvasClicked.connect(self.handleMouseDown)
Nathan W

1

Böyle bir şey deneyin (bu bir nokta seçmek içindir):

def run(self):
    self.pointEmitter = QgsMapToolEmitPoint(self.iface.mapCanvas())
    QObject.connect( self.pointEmitter, SIGNAL("canvasClicked(const QgsPoint, Qt::MouseButton)"), self.selectNow)
    self.iface.mapCanvas().setMapTool( self.pointEmitter )

def selectNow(self, point, button):
  #QMessageBox.information(None, "Clicked coords", " x: " + str(point.x()) + " Y: " + str(point.y()) )

  layer = self.iface.activeLayer()
  if not layer or layer.type() != QgsMapLayer.VectorLayer:
     QMessageBox.warning(None, "No!", "Select a vector layer")
     return

  width = self.iface.mapCanvas().mapUnitsPerPixel() * 2
  rect = QgsRectangle(point.x() - width,
                      point.y() - width,
                      point.x() + width,
                      point.y() + width)

  rect = self.iface.mapCanvas().mapRenderer().mapToLayerCoordinates(layer, rect)

  layer.select([], rect)
  feat = QgsFeature()

  ids = []
  while layer.nextFeature(feat):
    ids.append( feat.id() )

  layer.setSelectedFeatures( ids )

Çok self.clickTool.canvasClicked.connect(self.handleMouseDown)daha temiz olduğu için sinyallere bağlanmak için sözdizimini kullanırdım.
Nathan W
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.