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.

Verificando qué elemento está en foco con QGraphicsItem.focusItem()

Aquí está el ejercicio que estoy haciendo, donde necesito crear cuadrados en una QGraphicsScene cada vez que hago clic en “create_button” y cuando hago clic en cualquiera de los cuadrados, el nombre de ese cuadrado debería mostrarse en un QLabel, que está debajo de QGraphicsView, y aquí está cómo estoy intentando hacerlo.

Esta es la ventana que uso.

Imagen

y aquí está el código

class rectangles(QtWidgets.QDialog):

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

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

        self.ui.create_button.clicked.connect(self.creator)
        self.scene.focusItemChanged.connect(self.nameDisplay)

    def variables(self):        
        self.scene = QtWidgets.QGraphicsScene()
        self.ui.canvas_area.setScene(self.scene)
        self.current_focus_obj = QGraphicsItem.focusItem() #el problema está aquí

    def creator(self): 
        rect = self.scene.addRect(-20,-20,40,40, QPen(Qt.red), QBrush(Qt.gray))
        rect.setFlag(QGraphicsItem.ItemIsMovable)
        rect.setFlag(QGraphicsItem.ItemIsFocusable)
        rect.setFlag(QGraphicsItem.ItemIsSelectable)
        num_list.remove(num_list[0])

    def nameDisplay(self):
        self.ui.name_line.setText(str(self.current_focus_obj)) #Aquí intento establecer
                                                               #el nombre del
                                                               #rectángulo activo
                                                               #en mi QLabel

if name == 'main':
    rectangles_window = rectangles()
    rectangles_window.ui.show()

Sin embargo, cuando ejecuto este código, obtengo el siguiente error:

Error: TypeError: el archivo línea 32: el descriptor ‘focusItem’ del objeto ‘PySide2.QtWidgets.QGraphicsItem’ necesita un argumento.

Honestamente, no entiendo realmente qué argumento debería pasar en focusItem() y ese es el problema. Pensé que no necesitaba ningún argumento ya que debería devolver cualquier objeto que esté actualmente en foco.
Este puede ser un problema pequeño, pero realmente está ralentizando mi ritmo en este momento, así que si alguien pudiera ayudarme, realmente lo apreciaría 🙂

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El mensaje de error indica que la función focusItem() de la clase QGraphicsItem es un descriptor y requiere un argumento. Por lo tanto, QGraphicsItem.focusItem() no es una declaración válida.

    Para obtener el elemento actualmente enfocado en una QGraphicsView, puedes utilizar la función focusItem() del objeto QGraphicsView en lugar de QGraphicsItem.

    Aquí está el código modificado que debería funcionar:

    class rectangles(QtWidgets.QDialog):
    
        def __init__(self):
            super(rectangles, self).__init__()
    
            loader = QtUiTools.QUiLoader()
            self.ui = loader.load(ui_path, self)
            self.variables()
    
            self.ui.create_button.clicked.connect(self.creator)
            self.scene.selectionChanged.connect(self.nameDisplay)
    
        def variables(self):        
            self.scene = QtWidgets.QGraphicsScene()
            self.ui.canvas_area.setScene(self.scene)
    
        def creator(self): 
            rect = self.scene.addRect(-20,-20,40,40, QPen(Qt.red), QBrush(Qt.gray))
            rect.setFlag(QGraphicsItem.ItemIsMovable)
            rect.setFlag(QGraphicsItem.ItemIsFocusable)
            rect.setFlag(QGraphicsItem.ItemIsSelectable)
    
        def nameDisplay(self):
            current_focus_obj = self.ui.canvas_area.focusItem()
            if current_focus_obj is not None:
                self.ui.name_line.setText(str(current_focus_obj))
    
    if __name__ == '__main__':
        rectangles_window = rectangles()
        rectangles_window.ui.show()
    

    En la función variables(), se eliminó la instrucción que establece self.current_focus_obj en QGraphicsItem.focusItem().

    En la función nameDisplay(), se utilizó self.ui.canvas_area.focusItem() para obtener el elemento actualmente enfocado en la QGraphicsView. Si el elemento enfocado no es None, se muestra su nombre en el QLineEdit.

    También se cambió la señal de focusItemChanged a selectionChanged. Esto asegurará que nameDisplay() se llame cuando se haga clic en un elemento, no solo cuando gane o pierda el enfoque.

Comments are closed.