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


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শীর্ষে ব্যবহার করতে হবে
নাথান ডাব্লু

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

অন্য কোনও কিছুর জন্য ম্যাপটোল সেট করুন বা NoneQgsMapCanvas.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.