পাইকজিআইএস-এ মাউসের ক্লিকের জন্য পরীক্ষামূলকভাবে পরীক্ষা করুন?


19

আমি কিউজিআইএস-এ মাউস ক্লিকের জন্য কীভাবে চেক করব তা জানতে চাই। আমি একটি অজগর প্লাগইন লেখার চেষ্টা করছি এবং কিউজিআইএস-এ ইতিমধ্যে বিদ্যমান "একক বৈশিষ্ট্য নির্বাচন করুন" সরঞ্জামের মতো কার্যকারিতা সরবরাহ করতে চাই।

আমি কিউজিআইএস এপি ডক্স পরীক্ষা করে খুঁজে পেয়েছি

QgsMapCanvas::CanvasProperties::mouseButtonDown

এটি আশাব্যঞ্জক মনে হচ্ছে। আমার কাছে একটি QgsMapCanvas অবজেক্ট রয়েছে তবে মাউসবাটনডাউন বৈশিষ্ট্যটি কীভাবে অ্যাক্সেস করবেন তা আমি দেখতে পাচ্ছি না।

আমি কিউজিআইএস এপিআইতে সম্পূর্ণ নতুন।

উত্তর:


23

একক বৈশিষ্ট্য নির্বাচন করুন এর মতো একটি নতুন সরঞ্জাম তৈরি করার সর্বোত্তম উপায় হ'ল QgsMapToolক্লাস থেকে উত্তরাধিকারী । যখন আপনার সরঞ্জামটি সক্রিয় থাকে, যা ব্যবহার করে সেট করা যেতে পারে QgsMapCanvas::setMapTool, ক্যানভাসটি পেতে যে কোনও কীবোর্ড বা ক্লিক ইভেন্টগুলি আপনার কাস্টম সরঞ্জামটিতে পাঠানো হবে।

এখানে একটি বেসিক QgsMapToolক্লাস

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

আপনার যা প্রয়োজন তা করতে পারেন canvasReleaseEventইত্যাদি

এই সরঞ্জামটি সক্রিয় করতে আপনি কেবলমাত্র:

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

আপনার প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ. এটি ঠিক আমার যা প্রয়োজন। তবে, আমি যখন এই সমাধানটি প্রয়োগ করার চেষ্টা করি তখন আমি নিম্নলিখিত ত্রুটিটি পাই class PointTool(QgsMapTool): NameError: name 'QgsMapTool' is not defined। কোন ধারনা?
— রবার্ট

1
আপনাকে from qgis.gui import QgsMapToolশীর্ষে ব্যবহার করতে হবে
— নাথান ডাব্লু

শেষ প্রশ্ন ... আপনি কীভাবে এই সরঞ্জামটি নিষ্ক্রিয় করবেন?
— রবার্ট

অন্য কোনও কিছুর জন্য ম্যাপটোল সেট করুন বা None। QgsMapCanvas.mapTool()আপনার কাজ শেষ হয়ে যাওয়ার পরে ব্যবহারকারীর যা পুনরায় পুনরুদ্ধার করা হয়েছিল তা ব্যবহার করে আমি এটি সংরক্ষণ করব।
— নাথান ডাব্লু

@ নাথানডাব্লু "" অন্য কোনও কিছুর সাথে মানচিত্রের সেট করতে "এর অর্থ এই যে আমি সরঞ্জামদণ্ডে 'প্যান ম্যাপ' ক্লিক করি, তাই না?
— 22:51

3

আমি মনে করি আপনি QGIS "ক্যানভাস ক্লিক করা" ব্যবহারের সংমিশ্রণে এটি করতে পারেন তবে প্রতিক্রিয়াটি মোকাবেলায় সিগন্যাল / স্লটসও ব্যবহার করতে পারেন:

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

চেষ্টা করা হয়নি তবে দেখা শুরু করার জন্য আপনাকে আরও কিছু তথ্য দেওয়া উচিত। এখানে একটি টিউটোরিয়াল রয়েছে যেখানে কেউ খুব বেসিক প্লাগইন তৈরি করতে এটি ব্যবহার করছেন।


1
তারা বিল্ট ইন QgsMapToolEmitPointক্লাস ব্যবহার করছে যা আপনাকে কোনও সরঞ্জামের জন্য প্রাথমিক সূচনা দেবে। পাইকিউটিতে সিগন্যালের সাথে সংযুক্ত হওয়ার একটি ভাল উপায় এই সিনট্যাক্সটি ব্যবহার করছেself.clickTool.canvasClicked.connect(self.handleMouseDown)
— নাথান ডাব্লু

1

এই জাতীয় কিছু চেষ্টা করুন (এটি একটি বিন্দু নির্বাচন করা):

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 )

আমি self.clickTool.canvasClicked.connect(self.handleMouseDown)সিনট্যাক্সটি সংকেতগুলিতে সংযোগ করতে ব্যবহার করব কারণ এটি অনেক পরিষ্কার er
— নাথান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.