Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Puntoinfinito en 18 Marzo 2013, 19:48 pm



Título: [Qt] Creación en horizontal por layouts?
Publicado por: Puntoinfinito en 18 Marzo 2013, 19:48 pm
Hola!! Tengo una preguntilla sobre Qt, antes de todo dejaré un código para ejemplificar el problema: (Pero ya os digo, fijaros solo en el segundo y tercer código)

Código
  1.    #include <QApplication>
  2.    #include <QHBoxLayout>
  3.    #include <QVBoxLayout>
  4.    #include <QLabel>
  5.    #include <QLineEdit>
  6.    #include <QPushButton>
  7.    #include <QDialog>
  8.  
  9.    int main(int argc, char *argv[])
  10.    {
  11.    QApplication app(argc, argv);
  12.  
  13.    QDialog ventana;
  14.    QHBoxLayout *layoutUsuario = new QHBoxLayout;
  15.    QHBoxLayout *layoutContrasenia = new QHBoxLayout;
  16.    QHBoxLayout *layoutBotones = new QHBoxLayout;
  17.    QVBoxLayout *layoutPrincipal = new QVBoxLayout(&ventana);
  18.  
  19.    QLabel *etiquetaUsuario = new QLabel("Usuario");
  20.    QLabel *etiquetaContrasenia = new QLabel("Password");
  21.  
  22.    QLineEdit *campoUsuario = new QLineEdit;
  23.    QLineEdit *campoContrasenia = new QLineEdit;
  24.  
  25.    QPushButton *botonAceptar = new QPushButton("Aceptar");
  26.    QPushButton *botonCancelar = new QPushButton("Cancelar");
  27.  
  28.    layoutUsuario->addWidget(etiquetaUsuario);
  29.    layoutUsuario->addWidget(campoUsuario);
  30.  
  31.    layoutContrasenia->addWidget(etiquetaContrasenia);
  32.    layoutContrasenia->addWidget(campoContrasenia);
  33.  
  34.    layoutBotones->addStretch();
  35.    layoutBotones->addWidget(botonAceptar);
  36.    layoutBotones->addWidget(botonCancelar);
  37.  
  38.    layoutPrincipal->addLayout(layoutUsuario);
  39.    layoutPrincipal->addLayout(layoutContrasenia);
  40.    layoutPrincipal->addLayout(layoutBotones);
  41.  
  42.    ventana.setWindowTitle(QObject::trUtf8("Iniciar Sesión"));
  43.    ventana.show();
  44.  
  45.    return app.exec();
  46.    }

Genera algo tal que así:

(http://www.zonaqt.com/sites/default/files/screenshots/EjemploLoginGUI.png)

Mi duda es la siguiente; no entiendo bien bien el funcionamiento de este código ya que lo que hace es crear una tabla de 3x3 donde en el primero hay un label con un textbox, el segundo lo mismo y el tercero dos botones. Pero quedan ordenadas de manera que no he definido bien bien, según lo que puedo leer, creo que lo ordena por layouts, cada layout es una nueva linea que tu le iras atribuyendo objectos de cualquier tipo:

Código
  1. QHBoxLayout *layoutUsuario = new QHBoxLayout;
  2. QHBoxLayout *layoutContrasenia = new QHBoxLayout;
  3. QHBoxLayout *layoutBotones = new QHBoxLayout;

Y luego como he dicho le atribuyo:

Código
  1. layoutUsuario->addWidget(etiquetaUsuario);
  2. layoutUsuario->addWidget(campoUsuario);
  3.  
  4. layoutContrasenia->addWidget(etiquetaContrasenia);
  5. layoutContrasenia->addWidget(campoContrasenia);
  6.  
  7. layoutBotones->addStretch();
  8. layoutBotones->addWidget(botonAceptar);
  9. layoutBotones->addWidget(botonCancelar);

Entonces lo digo bien o no? xD es cierto que se ordena mediante los layouts? Es algo que en este ejemplo no me ha quedado muy claro ya que estaba acostumbrado a hacerlo de manera tabuladora...

Código:
layout->addWidget(boton1, 0, 0);
layout->addWidget(boton2, 1, 1);
layout->addWidget(boton3, 3, 3);

...que es como creo que es como queda mejor xD

Saludos!!


Título: Re: [Qt] Creación en horizontal automatizada?
Publicado por: avesudra en 18 Marzo 2013, 22:00 pm
Sí es exactamente como dices, en ese programa está ordenado así:
(http://img607.imageshack.us/img607/5748/sinttulo1cv.png)
En los layouts horizontales, los widget se van añadiendo uno al lado del otro, y en los verticales en una pila, por eso sale como sale. Fíjate que el layout principal es un layout vertical no horizontal. Es sencillo de entender.

¡Un saludo!


Título: Re: [Qt] Creación en horizontal automatizada?
Publicado por: Puntoinfinito en 18 Marzo 2013, 22:09 pm
Ahhhh!! Ahora pillo lo de;

Código:
QHBoxLayout
QVBoxLayout

Ya lo entiendo!! Gracias!! :)

Pero una pregunta, y si lo que quiero hacer es hacer un hueco entre layout y layout, creo uno sin contenido y luego lo añado al principal entre los dos que quiero separar??

Saludos!!


Título: Re: [Qt] Creación en horizontal por layouts?
Publicado por: avesudra en 18 Marzo 2013, 22:20 pm
Me alegro de que lo entiendas, para hacer un hueco debes hacer un layout entre dos layouts y ponerle este "widget"(QSpacerItem) http://qt-project.org/doc/qt-4.8/qspaceritem.html .Es un espacio, que puede ser vertical o horizontal y del tamaño que quieras.Si no le pones nada será un layout vacío tamaño 0 supongo...

¡Un saludo!


Título: Re: [Qt] Creación en horizontal por layouts?
Publicado por: Puntoinfinito en 18 Marzo 2013, 22:26 pm
Entendido, gracias de nuevo, si vuelvo a tener una duda de Qt no dudaré en preguntártelo xD

Saludos avesudra  :D