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.
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
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 🙂
davy.ai
Solución
El mensaje de error indica que la función
focusItem()
de la claseQGraphicsItem
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ónfocusItem()
del objetoQGraphicsView
en lugar deQGraphicsItem
.Aquí está el código modificado que debería funcionar:
En la función
variables()
, se eliminó la instrucción que estableceself.current_focus_obj
enQGraphicsItem.focusItem()
.En la función
nameDisplay()
, se utilizóself.ui.canvas_area.focusItem()
para obtener el elemento actualmente enfocado en laQGraphicsView
. Si el elemento enfocado no esNone
, se muestra su nombre en elQLineEdit
.También se cambió la señal de
focusItemChanged
aselectionChanged
. Esto asegurará quenameDisplay()
se llame cuando se haga clic en un elemento, no solo cuando gane o pierda el enfoque.