Anec-notas (II)

Esta semana ha sido bastante movida ya que tenemos la entrega de un producto para la semana que viene, ya sabéis, afinar detalles y esas cosas, así que en esta segunda emisión de Anec-notas tendremos un par de puntos prácticos sobre Qt.

QLineEdit

El control QLineEdit es probablemente de los más utilizados a la hora de crear formularios. Normalmente se fija su contenido con un QLineEdit::setText(QString) al cargar el formulario, y se lee de vuelta su valor con un (QString)QLineEdit::text() al cerrar o validar el mismo. Lo que ocurre en este caso es que el flujo de la aplicación no establece puntos “finales” claros en los que validar u obtener el contenido del control (es decir, no hay un botón “Aceptar” o “Guardar”), sino que debe hacerse continuamente (cada vez que hay un cambio), guardando el contenido a la base de datos.

Con este fin es posible utilizar las señales textChanged(QString) y textEdit(QString), que se emiten cada vez que el contenido del control es modificado. La principal diferencia entre ellas radica en que textEdit sólo se emite cuando el contenido del control es modificado desde la interfaz (por el usuario), mientras que textChanged es emitida también si se cambia programáticamente mediante setText(QString). Para evitar que cada vez que inicialice el control tenga que escribir en la base de datos (operación innecesaria ya que el contenido en ese momento es el mismo), se utiliza la señal textEdit(QString).

Menús contextuales

Cuando se despliega un menú contextual, éste se apropia del mouse (grabMouse) lo que evita que los widgets que han solicitado seguir continuamente el movimiento del cursor no reciban el evento mientras el menú contextual esté desplegado. Como ejemplo práctico, imaginemos un widget que renderiza elementos gráficos propios, como un widget de OpenGL, y que mediante eventos MouseMove cambia el estado “highlighted” de los elementos que están debajo del cursor. Al desplegar el menú contextual para ese elemento, el widget deja de recibir el evento de MouseMove, por lo que cuando se oculta el menú contextual, el mouse puede estar en otra posición, resultando en una incoherencia entre el elemento resaltado y el cursor.

Los menús tienen una señal, aboutToHide(), que se emite cuando el menú se oculta, bien sea por seleccionar una entrada del menú o por desactivar el menú. Con esta señal se puede actualizar el estado de los elementos forzando un evento MouseMove. Ahora bien, este evento se emite antes de llamar al método asociado a la entrada del menú, por lo que si éste necesita del estado actual (por ejemplo, el elemento resaltado) debe tenerse este hecho en cuenta.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.