IIC2233 / Syllabus-2021-2

Repositorio oficial del curso IIC2233 Programación Avanzada 🚀✨
https://iic2233.github.io/
38 stars 48 forks source link

Duda sobre addWidget #222

Closed diegocostares closed 3 years ago

diegocostares commented 3 years ago

Prerrequisitos

Duda

Hola, en la ventana de juego cree un QWidget de dimensiones fijas para incorporar todos los elementos del mapa y demas, desde QTdesigner puedo incorporar labels sin problema a estas clases y me permiten manejar las posiciones de forma mucho mas agradable, sin embargo cuando intento incorporar nuevos elementos a esta desde el código con addWidget me tira error:

self.elementos.addWidget(self.label)
AttributeError: 'QWidget' object has no attribute 'addWidget'

Entonces me gustaría saber si hay alguna otra clase que me permita definir la geometría respecto a una "caja de juego". Los layout no me sirven y también lo intenté con QFrame

tqmbanados commented 3 years ago

Hola @diegocostares!

QWidget no tiene un método llamado addWidget. Para hacer que un sub-widget le "pertenezca" a otro, debes hacerlo con el atributo parent de la sub-widget. Esto usualmente se hace al instanciar el sub-widget. Para organizar correctamente en la ventana los elementos, es muy importante saber usar bien los QLayout. ¿Por qué dices que no puedes usarlos?

diegocostares commented 3 years ago

@tqmbanados estoy usando los layout para centrar el QWidget de la zona de juego, pero si creo que la zona de juego con layout horizontal según yo no me permite agregar elementos y moverlos en si. De todos modos no me quedo muy claro como usar el atributo parent, ¿podrías dar un ejemplo por favor?

La solución que había llegado el findesemana fue agregar todos los QLabels necesarios dentro de qtdesigner pero el otro problema que estoy teniendo es que si por ejemplo quisiera crear una clase Rana que represente el QLabel de la rana, no se como vincularlo con el ya creado (tampoco sé si esa clase rana tendría que ir en el frontend o en el backend)

tqmbanados commented 3 years ago

mmm, me parece que te estás complicando demasiado! Recuerda que puedes poner un QLayout dentro de un QWidget, y este widget adentro de otro QLayout en otro QWidget. Una de las gracias de PyQt5 es que permite una estructuración de varias ventanasy sub ventanas ordenada y eficientemente. Al agregar elementos que se vayan moviendo, puedes asignar su posición inicial con move() o setGeometry(). Esta posición es relativa al parent. Es decir, la posición 0,0 corresponde a la esquina superior izquierda del QWidget que los contiene. Definir el parent es bastante simple:

parent_widget = QWidget()  # Esta es una ventana
child_widget = QWidget(parent=parent_widget)  # Esto generará una sub-ventana dentro de la ventana anterior
label = QLabel("Soy un Label, hola", parent=child_widget)  # Este label depende de la sub_ventana.

En el código anterior, al cambiar la posición de label, se seteará a una posición relativa dentro de child_widget, que a su vez, tiene una posición relativa dentro de parent_widget.

No tengo que claro a que te refieres con la pregunta de la rana. ¿Cuál es el "ya creado" que mencionas? Recuerda que todos los QLabel van en el front-end.

Finalmente, te recomiendo muchísimo revisar el docs de PyQt5. Es indispensable para poder realizar de manera correcta la tarea. Ahí es posible que se te aclaren muchas dudas!

diegocostares commented 3 years ago

uffff con lo del parent me aclaraste muchísimas cosas!!! Lo había visto en ejemplos pero no entendía como funcionaba, ahora me quedo super claro.

A lo que me referia con lo de ya creado es que todos los QLabel los puse en QTdesigner y no sabia como relacionarlo con la clase, pero ahora con lo de los parrent creo que lo podré hacer de otra forma 💯

tqmbanados commented 3 years ago

Me alegro que se te solucionó! Lo de designer, si entiendo bien, puedes acceder al widget que creaste en designer con su ObjectName o algo parecido, que es uno de sus atributos en desginer. Este corresponde al atributo de la ventana que contiene el widget.