es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo eliminar un QGraphicsItem en un PlotItem haciendo clic en él con el mouse.

Si el módulo superior es una pg.GraphicsScene, puede funcionar correctamente. Cuando se agrega un rectángulo a la escena, se puede seleccionar mediante itemAt() y eliminarlo de la escena. Pero cuando el módulo superior es un pg.GraphicsLayoutWidget, con un PlotItem agregado mediante addPlot, el rectángulo se agrega al PlotItem, y ahora itemAt() devuelve un QGraphicsRectItem que parece ser parte de cosas de fondo, pero no apunta al rectángulo agregado. Si se realiza la eliminación, este QGraphicsRectItem se eliminará primero, luego se puede seleccionar el rectángulo agregado. ¿Cuál es la razón y qué es el fondo de QGraphicsRectItem en el nivel de selección superior? ¡Cualquier ayuda será muy apreciada!

import sys
import pyqtgraph as pg
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtWidgets import QGraphicsRectItem
pg.setConfigOption('background', 'k')
pg.setConfigOption('foreground', 'w')

rect1 = QGraphicsRectItem(120, 120, 60, 60)
rect1.setPen(pg.mkPen((51, 51, 153), width=2))
rect1.setBrush(pg.mkBrush(51, 51, 153, 50))

rect2 = QGraphicsRectItem(200, 200, 80, 80)
rect2.setPen(pg.mkPen((51, 51, 153), width=2))
rect2.setBrush(pg.mkBrush(51, 51, 153, 50))

rect1.setFlag(rect1.ItemIsFocusable)
rect1.setFlag(rect1.ItemIsSelectable)
rect2.setFlag(rect2.ItemIsFocusable)
rect2.setFlag(rect2.ItemIsSelectable)

rect1.setZValue(1000)
rect2.setZValue(1000)

class win(pg.GraphicsLayoutWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle('pyqtgraph GraphicsLayoutWidget')

        self.plt1 = self.addPlot(title='pyqtgraph PlotItem')
        self.plt1.setEnabled(False)

        self.plt1.addItem(rect1)
        self.plt1.addItem(rect2)
        self.plt1.disableAutoRange()

    def mousePressEvent(self, event):
        #item = self.scene().itemAt(event.pos(), QtGui.QTransform())
        item = self.itemAt(event.pos())
        print(item)
        #self.plt1.removeItem(item)
        self.scene().removeItem(item)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = win()
    w.show()
    sys.exit(app.exec_())
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el método itemAt() que devuelve un QGraphicsRectItem que no es el rectángulo añadido se debe a que el rectángulo se añade a un PlotItem que es un elemento secundario del GraphicsLayoutWidget, y por lo tanto el rectángulo es en realidad un elemento secundario del PlotItem. Cuando se utiliza itemAt() en el GraphicsLayoutWidget, devuelve el QGraphicsRectItem de nivel superior que probablemente es un elemento de fondo utilizado para el PlotItem.

    Para seleccionar y eliminar el rectángulo añadido, es necesario realizar primero la eliminación del QGraphicsRectItem de nivel superior, luego se puede seleccionar y eliminar el rectángulo añadido. Esto se debe a que el rectángulo añadido es un elemento secundario del PlotItem y eliminar el QGraphicsRectItem de nivel superior no lo afectará directamente.

    En resumen, el QGraphicsRectItem devuelto por itemAt() en el nivel de selección superior probablemente es un elemento de fondo utilizado para el PlotItem y el rectángulo añadido es un elemento secundario del PlotItem. Para seleccionar y eliminar correctamente el rectángulo añadido, es necesario eliminar primero el QGraphicsRectItem de nivel superior.

Comments are closed.