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.

Crea un QGraphicsItem en la posición donde se haga doble clic con el ratón.

Estoy escribiendo un programa que debe crear un QGraphicsItem cuando se produce un doble clic (dentro del área de la escena), y también ese elemento debe crearse en la posición del doble clic. Ya he escrito algo de código, pero no funciona correctamente. Cuando hago doble clic en la escena, se crea un elemento, pero en un lugar completamente diferente. Por lo tanto, ese es el problema actual. Necesito que se cree en la posición del ratón.

Aquí está mi código:

ui_path = "C:/Users/User/Desktop/programming/Creator/Creator.ui"

class Creator(QtWidgets.QWidget):
count = 0

def __init__(self):
    super(Creator, self).__init__()

    loader = QtUiTools.QUiLoader()
    self.ui = loader.load(ui_path, self)

    self.variables()

    self.ui.canvas_area.viewport().installEventFilter(self) #canvas_area es el QGraphicsView

    self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.CustomizeWindowHint | Qt.WindowStaysOnTopHint)

def variables(self):
    self.scene = QtWidgets.QGraphicsScene()
    self.ui.canvas_area.setScene(self.scene)

def eventFilter(self, obj, event):
    if obj is self.ui.canvas_area.viewport():
        if event.type() == QtCore.QEvent.MouseButtonDblClick:
            self.createItems(event)
    return super(Creator, self).eventFilter(obj, event)

def createItems(self, event):
    pos = event.pos()
    self._x = pos.x()
    self._y = pos.y()

    rect = self.scene.addRect(self._x, self._y, 40, 40, QPen(Qt.red), QBrush(Qt.gray))

    rect.setFlag(QGraphicsItem.ItemIsMovable)
    rect.setFlag(QGraphicsItem.ItemIsFocusable)
    rect.setFlag(QGraphicsItem.ItemIsSelectable)

if name == ‘main’:
creator_window = Creator()
creator_window.ui.show()

He leído algo sobre mapFromScene y mapToScene, y que esto puede resolver el problema, pero realmente no entiendo cómo usarlos. Además, hay algunos ejemplos de esto, pero todos los que he encontrado están en C++, de lo cual no sé nada. Así que si alguien pudiera ayudarme a resolver este problema, lo agradecería mucho.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear un QGraphicsItem en la posición del mouse al hacer doble clic, debes usar el método mapToScene para transformar las coordenadas del mouse de la vista a las coordenadas de la escena.

    Aquí tienes una versión actualizada de tu método crearItems que debería funcionar:

    def crearItems(self, event):
        pos_vista = event.pos()
        pos_escena = self.ui.canvas_area.mapToScene(pos_vista)
    
        rect = self.scene.addRect(pos_escena.x(), pos_escena.y(), 40, 40, QPen(Qt.red), QBrush(Qt.gray))
    
        rect.setFlag(QGraphicsItem.ItemIsMovable)
        rect.setFlag(QGraphicsItem.ItemIsFocusable)
        rect.setFlag(QGraphicsItem.ItemIsSelectable)
    

    En esta versión, usamos mapToScene para obtener la posición del mouse en las coordenadas de la escena. Luego, usamos esas coordenadas para agregar el QGraphicsRectItem.

    ¡Espero que esto ayude!

Comments are closed.