簡體   English   中英

PyQgis:項目不是 QgsMapCanvas 上的預期類型

[英]PyQgis: item is not the expected type on a QgsMapCanvas

我目前正在開發基於 PyQgis 的獨立應用程序,我需要將各種 QgsRubberBand 添加到我的 Canvas。

我做了它的一個子類:LineAnnotation。

問題是,當我在“canvasPressEvent”上使用方法“QgsMapCanvas.itemAt(event.pos())”時,它返回“qgis._gui.QgsRubberBand”object,而不是“LineAnnotation”。

我做錯什么了嗎? 如果我的程序的 rest 不能識別它是一個 LineAnnotation,它就無法工作,因為它包含幾個我需要使用的新方法。

此外,如果我嘗試使用 QgsRubberBand 中的其中一種方法,我根本無法與該項目進行交互,應用程序會崩潰。

這是有問題的代碼:

from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge, QgsRubberBand
from qgis.core import QgsApplication, QgsProject, QgsPointXY, QgsGeometry
from qgis.PyQt.QtGui import QColor
import sys

class LineAnnotation(QgsRubberBand):
    def __init__(self, canvas):
        QgsRubberBand.__init__(self, canvas)
        self.setColor(QColor("red") )
        self.setWidth(10)

class Interface(QgsMapCanvas):
    def __init__(self):
        QgsMapCanvas.__init__(self)
        self.setCanvasColor(QColor("#182F36") )
        project_path = "project_path"

        project = QgsProject.instance()
        project.read(project_path)
        layer_tree = QgsLayerTreeMapCanvasBridge(project.layerTreeRoot(), canvas=self)
        layer_tree.setAutoSetupOnFirstLayer(False)
        self.zoomToFeatureExtent(project.mapLayersByName('layer_name')[0].extent() )
        self.enableAntiAliasing(True)
        self.setAcceptDrops(True)
        self.setParallelRenderingEnabled(True)

        p1 = QgsPointXY(524670.46860305720474571, 5470375.41737424582242966)
        p2 = QgsPointXY(589864.10151600651443005, 5487531.63656186405569315)

        r = LineAnnotation(self)
        r.setToGeometry(QgsGeometry.fromPolylineXY([p1, p2]) )

    def mousePressEvent(self, event) -> None:
        item = self.itemAt(event.pos() )
        print(type(item) ) 
        # Output is "<class 'qgis._gui.QgsRubberBand'>"
        # Expected: "<class 'LineAnnotation'>"

class StackOverflow:
    def __init__(self):
        qgs = QgsApplication([], True)
        qgs.setDoubleClickInterval(250)
        qgs.initQgis()

        graphicUI = Interface()
        graphicUI.showMaximized()

        sys.exit(qgs.exec_() )

if __name__ == '__main__':
    app = StackOverflow()


> output: \<class 'qgis.\_gui.QgsRubberBand'\>
> Desired output: \<class 'lineAnnotation.LineAnnotation'\>

問題似乎出現在 Qgis 3.26 之前的版本中,我的問題在更新到最新版本 (3.28) 后得到解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM