Você está na página 1de 54

Introduccin a Qt

http://www.zonaqt.com/book/export/html/283

Introduccin a Qt
Para una introduccin un poco ms completa puedes consultar la introduccin del tutorial creado para Zona Qt Qt es un framework para el desarrollo de aplicaciones multiplataforma creado por la compaia Trolltech y que actualmente es propiedad de Nokia, la funcin ms conocida de Qt es la de la creacin de interfaces de usuario, sin embargo no se limita a esto, ya que tambin provee varias clases para facilitar ciertas tareas de programacin como el manejo de sockets, soporte para programacin multihilo, comunicacin con bases de datos, manejo de cadenas de caracteres, entre otras. Qt utiliza C++ de manera nativa, pero ofrece soporte para otros lenguajes como Python mediante PyQt, Java mediante QtJambi, o C# mediante Qyoto. Qt es un framework muy poderoso, comparable con Swing de Java o .NET de Microsoft, adems ofrece una suite de aplicaciones para facilitar y agilizar las tareas de desarrollo, las aplicaciones que componen esta suite son: Qt Assistant: Herramienta para visualizar la documentacin ocial de Qt. Qt Designer: Herramienta WYSIWYG para crear interfaces de usuario. Qt Linguist: Herramienta para la traduccin de aplicaciones. Qt Creator: IDE para el lenguaje C++, pero especialmente diseado para Qt, integra las primeras dos herramientas mencionadas. Qt es utilizado por empresas como Intel, Google o Dreamworks. Algunos ejemplos de aplicaciones desarrolladas utilizando Qt son: El entorno de escritorio KDE Google Earth Skype Virtual Box Qt est disponible bajo las siguientes licencias: Qt GNU GPL v. 3.0: Utilizada para el desarrollo de aplicaciones de cdigo abierto. Si se realizan cambios al cdigo fuente de Qt, estos tienen la obligacin de liberarse. Qt GNU LGPL v.2.1: Permite el desarrollo de aplicaciones privativas bajo ciertas restricciones. Si se realizan cambios al cdigo fuente de Qt, estos tienen la obligacin de liberarse. Commercial: Es la nica licencia con costo, es utilizada para el desarrollo de aplicaciones propietarias, incluye soporte y la posibilidad de liberar las aplicaciones desarrolladas bajo cualquier licencia. Si se ralizan cambios al cdigo fuente de Qt, estos no tienen la obligacin de ser compartidos. Puedes comenzar el tutorial de Qt en el artculo Instalacin de Qt.

1 de 1

04/12/11 23:38

Instalacin de Qt 4

http://www.zonaqt.com/book/export/html/284

Instalacin de Qt 4
En este artculo revisamos algunas de las formas que existen de instalar y congurar el entorno de desarrollo de Qt, hablamos un poco de sus ventajas y desventajas e indicamos la forma de instalarlo. Instalar Qt utilizando un asistente de instalacin Instalar Qt mediante la compilacin del cdigo fuente A continuacin, describimos cada una de ellas.

Instalar Qt utilizando un asistente de instalacin


Ventajas: Este mtodo tambin es sencillo de realizar. Permite facilmente mantenerse con la versin ms reciente de Qt. Permite instalar versiones anteriores de Qt si es que lo requerimos. Desventajas: Puede generar un poco de confusin debido a que, dependiendo de los permisos con los que realicemos la instalacin, las herramientas de Qt pueden o no ser agregadas al path por el instalador. Instrucciones: Descargar la versin que deseemos instalar, tpicamente la ms reciente, desde la pgina ocial de descargas de Qt: http://qt.nokia.com/downloads/ En dnde el nombre del instalador suele tener la forma: qt-sdk-[plataforma]-[arquitectura]-[versionlicencia]-[version]-[revision].[extension] Un ejemplo de ello es la versin 4.6.3 opensource de 32 bits para linux que lleva por nombre qt-sdk-linux-x86-opensource-2010.03.bin Despus ejecutamos el instalador y seguimos las instrucciones que nos muestra e indicamos la informacin que nos pide (path de instalacin, aceptar el acuerdo de licencia). Una vez terminada la instalacin podemos ejecutar el entorno de desarrollo integrado Qt Creator y comenzar a crear aplicaciones o revisar los impresionantes ejemplos :D. Si queremos utilizar las herramientas desde la terminal es necesario ejecutarlas indicando el path en el que estn instaladas, por ejemplo en linux, /home/usuario /qt-sdk-qt-sdk-linux-x86-opensource-2010.03/qt/bin/qmake o si lo preferimos agregar al path dicha ruta para slo indicar el nombre del ejecutable. Si existe ms de una versin en el path del sistema suele tomar en cuenta la que aparece primero. Notas: Este mtodo puede generar algo de confusin con la versin que se est utilizando para compilar, sobre todo si se utiliza Qt Creator, ya que dentro de l se puede especicar con que versin de las instaladas (y que se le haya indicado previamente) se desea compilar algn proyecto, sea o no la del path.

Instalar Qt mediante la compilacin del cdigo fuente


Ventajas: A pesar de ser el mtodo ms complicado de los tres, se simplica
1 de 2 04/12/11 23:38

Instalacin de Qt 4

http://www.zonaqt.com/book/export/html/284

bastante gracias al script de conguracin y compilacin que se incluye, al cual slo debemos indicarle con que parmetros deseamos incluir o excluir en la construccin de nuestro entorno de desarrollo de Qt. Suele ser la forma ideal si requerimos alguna caracterstica adicional a las predeterminadas, como soporte para MySQL en Windows, o si deseamos utilizar una versin an en desarrollo. Desventajas: Aparte de ser la forma ms complicada de las tres, la compilacin de Qt toma bastante tiempo, dependiendo del harware de la mquina puede llegar a unas 10 horas o ms. Algunas veces los scripts de instalacin presentan algn problema que puede complicar todo ya que no se puede construir mediante los parmetros denidos en el asistente y habr que buscar que es lo que falla y cmo solucionarlo. Instrucciones: Descarga el cdigo fuente desde la pgina ocial de descargas de Qt: http:/qt.nokia.com/downloads Una vez descargado el archivo, lo descomprimimos, buscamos el script de conguracin, de nombre congure, lo ejecutamos y seguimos las instrucciones. Luego esperamos (un largo tiempo) a que termine la instalacin. Podemos agregar una versin compilada al Qt Creator y al path del sistema con el n de utilizarla de manera ms cmoda. Es todo en este artculo de instalacin. Si tienes algn problema con tu instalacin puedes solicitar ayuda en la seccin Instalacin e Implementacin del Foro de Zona Qt.

2 de 2

04/12/11 23:38

Nuestro Primer Programa en Qt: "Hola Mundo"

http://www.zonaqt.com/book/export/html/285

Nuestro Primer Programa en Qt: "Hola Mundo"


En este artculo vamos a crear y explicar a detalle la clsica primera aplicacin en programacin, esta vez con Qt. El cdigo de un Hola Mundo en Qt es el siguiente
#include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel *label = new QLabel("Hola Mundo!"); label->show(); return app.exec(); }

Revisaremos el cdigo linea por lnea:


#include <QApplication> #include <QLabel>

En las primeras dos lneas incluimos los archivos de cabecera que utilizaremos para el ejemplo, QApplication es una clase que representa una aplicacin grca de Qt, es la encargada de administrar el ujo de ejecucin y la conguracin principal de la aplicacin. QLabel es una clase que representa a un control de interfaz de usuario etiqueta, el cual es generalmente utilizado para mostrar texto no editable en pantalla.
int main(int argc, char *argv[])

Declaramos nuestra funcin main en la cual comenzar la ejecucin de nuestro programa, es necesario especicar los argumentos de lnea de comandos argc (un entero que contiene el nmero de argumentos) y argv (un arreglo/matriz que contiene el valor de cada uno de los argumentos) ya que al crear un objeto de la clase QApplication es necesario especicarlos.
QApplication app(argc, argv);

Crea el objeto QApplication llamado app y pasa como parmetros los argumentos de lnea de comandos.
QLabel label("Hola Mundo!");

Crea un objeto QLabel llamado label, y la cual contendr el texto que queremos mostrar en pantalla, el cual especicamos como argumento del constructor.

1 de 9

04/12/11 23:39

Nuestro Primer Programa en Qt: "Hola Mundo"


label.show();

http://www.zonaqt.com/book/export/html/285

Muestra la etiqueta en pantalla. Qt se encargar de crear una ventana para poder mostrar la etiqueta en pantalla ya que nosotros no hemos asignado alguna.
return app.exec();

Inicia el hilo principal de la aplicacin a partir de este momento el framework toma el control de la aplicacin y responde a la interaccin del usuario con los controles de interfaz grca de acuerdo a todo lo especicado anteriormente. La sentencia return regresa al sistema operativo la respuesta de la ejecucin del programa una vez que ha nalizado, esta respuesta tipicamente ser cero en caso de que la aplicacin se haya ejecutado exitosamente.

Construccin de un Proyecto Utilizando la Terminal


Compilacin y ejecucin utilizando una consola o terminal
Escribimos el texto del ejemplo en un archivo de texto sin formato utilizando una herramienta como el bloc de notas de windows o editores de texto plano de GNU/Linux como GEdit o Kate, guardamos el archivo como holamundo.cpp o cualquier otro nombre con extensin .cpp. Abrimos una terminal en la ubicacin de nuestro archivo holamundo.cpp y ejecutamos los siguientes comandos: Para crear un archivo de proyecto para nuestra aplicacin ejecutamos el comando:
qmake -project

Creamos un archivo de proyecto especco para la plataforma o SO en el que estamos trabajando con el comando:
qmake

Para especicar el archivo de proyecto a utilizar, muy til cuando existe ms de un archivo de proyecto en nuestro directorio de trabajo actual, ejecutamos el comando:
qmake [nombre-de-archivo-de-proyecto].pro

Para generar el archivo ejecutable de nuestra aplicacin, ejecutamos el comando:


make

o si utilizamos windows el comando ser:


mingw32-make

Al igual que suceda con los archivos de proyecto, si existe ms de un archivo de construccin de proyecto habr que especicar el nombre del archivo que deseamos que

2 de 9

04/12/11 23:39

Nuestro Primer Programa en Qt: "Hola Mundo"

http://www.zonaqt.com/book/export/html/285

se procese. Para ejecutar el archivo ejecutable generado por el compilador al procesar nuestro cdigo, utilizamos el comando:
./holamundo

o si utilizamos windows, el comando ser:


holamundo.exe

Si todo ha ido bien deberas ver una ventana parecida a la siguiente

Construccin de un Proyecto Utilizando Qt Creator


Compilacin y Ejecucin utilizando Qt Creator Ejecutamos la aplicacin Qt Creator seleccionandola del men de aplicaciones de nuestro sistema.

3 de 9

04/12/11 23:39

Construccin de un Proyecto Utilizando Qt Creator

http://www.zonaqt.com/book/export/html/569

Construccin de un Proyecto Utilizando Qt Creator


Compilacin y Ejecucin utilizando Qt Creator Ejecutamos la aplicacin Qt Creator seleccionandola del men de aplicaciones de nuestro sistema.

Al hacerlo veremos la pantalla de bienvenida de Qt Creator

1 de 6

04/12/11 23:41

Construccin de un Proyecto Utilizando Qt Creator

http://www.zonaqt.com/book/export/html/569

En ella seleccionamos la opcin "New File or Project..." del Men "File"

2 de 6

04/12/11 23:41

Construccin de un Proyecto Utilizando Qt Creator

http://www.zonaqt.com/book/export/html/569

Veremos un asistente de creacin de nuevo proyecto, para este ejemplo seleccionaremos un proyecto vaco.

En el siguiente paso del asistente seleccionamos las plataformas (targets) para las cuales deseamos construir nuestra aplicacin Qt, para este ejemplo nos sirve cualquiera, nosotros elegimos Desktop/Escritorio En los pasos siguientes del asistente se nos solicitar el nombre del archivo e informacin sobre control de versiones, para el nombre nos sirve cualquiera, nosotros utilizamos HolaQt.cpp y para el control de versiones por ahora basta con presionar "Finish"

3 de 6

04/12/11 23:41

Construccin de un Proyecto Utilizando Qt Creator

http://www.zonaqt.com/book/export/html/569

Agregamos un nuevo archivo al proyecto, haciendo clic derecho en la carpeta principal del proyecto y seleccionando la opcin "Add New..." del men contextual que aparece

4 de 6

04/12/11 23:41

Construccin de un Proyecto Utilizando Qt Creator

http://www.zonaqt.com/book/export/html/569

Escribimos el cdigo del ejemplo y presionamos el botn de ejecutar y construir aplicacin. El botn de ejecutar y construir es el botn con una echa color verde colocado en la parte inferior izquierda de la interfaz de Qt Creator, en la siguiente imagen est debajo del icono de una computadora y tiene un tooltip con el texto "Run Ctrl+R". Ctrl+R es el atajo de teclado para ejecutar la accin que realiza este botn.

Esperamos a que la compilacin termine y veremos nuestro programa en ejecucin

5 de 6

04/12/11 23:41

Construccin de un Proyecto Utilizando Qt Creator

http://www.zonaqt.com/book/export/html/569

6 de 6

04/12/11 23:41

QHBoxLayout Organizar Widgets de Manera Horizontal

http://www.zonaqt.com/book/export/html/287

QHBoxLayout Organizar Widgets de Manera Horizontal


El QHBoxLayout Nos permite ordenar los widgets en las, es decir, de manera horizontal.

El cdigo para crear una aplicacin con un layout como el de la imagen anterior es el siguiente, explicaremos slo las lneas de cdigo que no hayan sido vistas a detalle en partes anteriores del tutorial:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. #include #include #include #include #include <QObject> <QApplication> <QDialog> <QHBoxLayout> <QPushButton>

int main(int argc, char *argv[]) { QApplication app(argc, argv); QDialog ventana; QHBoxLayout *layout QPushButton *boton1 QPushButton *boton2 QPushButton *boton3

= = = =

new new new new

QHBoxLayout(&ventana); QPushButton(QObject::trUtf8("Botn 1")); QPushButton(QObject::trUtf8("Botn 2")); QPushButton(QObject::trUtf8("Botn 3"));

layout->addWidget(boton1); layout->addWidget(boton2); layout->addWidget(boton3); ventana.setWindowTitle("QHBoxLayout"); ventana.show(); return app.exec(); }

Las lneas 1 a 5 importan las bibliotecas necesarias para esta aplicacin, QObject nos proveer de la funcin trUtf8() necesaria para escribir cadenas con caracteres Unicode, en nuestro caso, caracteres propios del espaol como la , o el acento (tilde). QDialog es una clase que representa un dilogo de aplicacin. Utilizamos un dilogo en lugar de una ventana principal buscando mantener la simplicidad del ejemplo. Un dilogo es una ventana mediante la cual el usuario y la aplicacin se comunican y los revisamos en un artculo siguiente del tutorial. Algunos de sus usos son:
1 de 3 04/12/11 23:41

QHBoxLayout Organizar Widgets de Manera Horizontal

http://www.zonaqt.com/book/export/html/287

Informar al usuario sobre la ocurrencia de algn evento relevante como una noticacin al terminar un proceso o un error al realizarlo. Solicitar conrmacin para realizar alguna accin como borrar o guardar un archivo. Solicitar informacin, como la palabra a buscar en un dilogo de buscar y reemplazar. QHBoxLayout es una clase que representa a nuestro layout horizontal. QPushButton es una clase que representa a un botn tpico.
11. 12. 13. QDialog ventana; QHBoxLayout *layout = new QHBoxLayout(); QPushButton *boton1 = new QPushButton(QObject::trUtf8("Botn 1"));

En las lneas 11 a 13 creamos un nuevo dilogo, layout y botn mediante la sentencia new para ejecutar el constructor de cada clase, en el parmetro del constructor del layout horizontal es un apuntador a su widget padre, sobre el cual el layout tendr efecto, el parmetro del constructor del botn es la cadena de texto que mostrar el botn. Las lneas 14 y 15 crean los otros botones de la misma forma.
17. 18. 19. layout->addWidget(boton1); layout->addWidget(boton2); layout->addWidget(boton3);

En las lneas 17 a 19 colocamos los botones dentro de nuestro layout mediante la funcin
addWidget(QWidget *widget, int stretch=0, Qt::Alignment aling=0)

Esta versin de esta funcin recibe como parmetros un apuntador al widget que deseamos agregar, un entero que indica el ndice de exibilidad (stretch) del widget y un elemento de la enumeracin Qt::Alignment, los ltimos dos parmetros pueden omitirse y en caso de hacerlo se les asigna el valor de cero. El stretch indica la proporcin de espacio disponible en el layout que el widget ocupar, es relativo al stretch indicado en los otros widgets que estn dentro del layout, entre mayor sea el valor de stretch mayor ser el espacio que ocupar el widget. La enumeracin Qt:Alignment indica la alineacin que tendr el widget y puede tener los siguiente valores: Horizontales: Qt::AlignLeft (izquierda), Qt::AlignRight (derecha), Qt::AlignHCenter (centrado horizontalmente), Qt::AlignJustify (justicado) Verticales:Qt::AlignTop (superior/arriba), Qt::AlignBottom (inferior/abajo), Qt::AlignVCenter (centrado verticalmente) Bidimensionales:Qt::AlignCenter (centrado horizontal y verticalmente) Los widgets se colocan en el orden en que se ejecutan las instrucciones, de forma que en este layout el primer botn de izquierda a derecha (la direccin por default de este layout) es boton1 seguido de boton2 y por ltimo boton3. Si queremos invertir el orden de los widgets podemos escribir las instrucciones en orden inverso o podemos indicar que nuestros widgets se aadan de derecha a izquierda con la instruccin setDirection(QBoxLayout:RightToLeft)

2 de 3

04/12/11 23:41

QHBoxLayout Organizar Widgets de Manera Horizontal


21. 22. ventana.setLayout(layout); ventana.setWindowTitle("QHBoxLayout");

http://www.zonaqt.com/book/export/html/287

Y por ltimo en la lnea 21 indicamos el ttulo que queremos que muestre nuestra ventana, si no se especica se utilizar el del nombre del archivo.

3 de 3

04/12/11 23:41

QVBoxLayout Organizar los Widgets de Manera Vertical

http://www.zonaqt.com/book/export/html/288

QVBoxLayout Organizar los Widgets de Manera Vertical


El QVBoxLayout Nos permite ordenar los widgets en columnas, es decir, de manera vertical.

El cdigo para crear una aplicacin con un layout como el de la imagen anterior es el siguiente:
#include #include #include #include #include <QObject> <QApplication> <QDialog> <QVBoxLayout> <QPushButton>

int main(int argc, char *argv[]) { QApplication app(argc, argv); QDialog ventana; QVBoxLayout *layout QPushButton *boton1 QPushButton *boton2 QPushButton *boton3

= = = =

new new new new

QVBoxLayout(); QPushButton(QObject::trUtf8("Botn 1")); QPushButton(QObject::trUtf8("Botn 2")); QPushButton(QObject::trUtf8("Botn 3"));

layout->addWidget(boton1); layout->addWidget(boton2); layout->addWidget(boton3); ventana.setLayout(layout); ventana.setWindowTitle("QVBoxLayout"); ventana.show(); return app.exec(); }

1 de 2

04/12/11 23:42

QVBoxLayout Organizar los Widgets de Manera Vertical

http://www.zonaqt.com/book/export/html/288

Si lo comparamos con el ejemplo anterior del QHBoxLayout, lo nico que cambia es que nuestro objeto layout ahora es de tipo QVBoxLayout, el resultado de esto es que los widgets ahora se organizan de acuerdo a las reglas de este layout, es decir, de arriba hacia abajo. Si queremos invertir el orden en que se agregan los widgets al layout utilizamos la instruccin
setDirection(QBoxLayout::BottomToTop)

2 de 2

04/12/11 23:42

QGrid Layout. Organizar los Widgets en Forma Tabular

http://www.zonaqt.com/book/export/html/289

QGrid Layout. Organizar los Widgets en Forma Tabular


El QGridLayout nos permite ordenar los widgets a manera de tabla o rejilla.

El cdigo para crear una aplicacin con un layout similar al de la imagen es:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. #include #include #include #include #include <QObject> <QApplication> <QDialog> <QGridLayout> <QPushButton>

int main(int argc, char *argv[]) { QApplication app(argc, argv); QDialog ventana; QGridLayout *layout QPushButton *boton1 QPushButton *boton2 QPushButton *boton3

= = = =

new new new new

QGridLayout(); QPushButton(QObject::trUtf8("Botn 1")); QPushButton(QObject::trUtf8("Botn 2")); QPushButton(QObject::trUtf8("Botn 3"));

layout->addWidget(boton1, 0, 0); layout->addWidget(boton2, 0, 1); layout->addWidget(boton3, 1, 1); ventana.setLayout(layout); ventana.setWindowTitle("QGridLayout"); ventana.show(); return app.exec(); }

1 de 3

04/12/11 23:42

QGrid Layout. Organizar los Widgets en Forma Tabular

http://www.zonaqt.com/book/export/html/289

Nuevamente cambiamos el tipo de nuestro objeto layout, ahora ser de la clase QGridLayout. La forma de agregar los widgets a este tipo de layout es ligeramente distinta, ahora lo haremos mediante la funcin
addWidget(QWidget *widget, int fila, int columna, Qt::Alignment align=0)

Esta funcin recibe como parmetros un apuntador al widget que deseamos agregar, dos enteros que indican la la y columna, respectivamente, de la celda sobre la cual queremos agregar el widget en cuestin y un valor de la enumeracin Qt::Alignment. Las las y columnas comienzan a contarse desde cero de tal manera que la primera celda en la esquina superior izquierda tiene la posicin la=0, columna=0.
layout->addWidget(boton1, 0, 0); layout->addWidget(boton2, 0, 1); layout->addWidget(boton3, 1, 0);

En la lnea 17 colocamos al primer botn en la celda denida por la interseccin de la la cero con la columna cero, es decir, posicin 0,0. Luego colocamos al boton2 y boton3 en las celdas 0,1 y 1,1 respectivamente. El espacio vaco en la celda 1,0 se genera debido a que el QGridLayout crea tantas divisiones de las y columnas como el nmero mximo de las o columnas que indiquemos, en este caso dos, debido a la existencia de las las y columnas uno y cero. Por ejemplo, si aadieramos los botones al layout mediante las lneas
layout->addWidget(boton1, 0, 0); layout->addWidget(boton2, 1, 1); layout->addWidget(boton3, 2, 2);

Obtendramos el siguiente resultado:

Sin embargo habr que tener en cuenta que las las o columnas extras no sern visibles a menos que establezcamos el alto/ancho mnimo de cada la/columna o que coloquemos un widget en la la/columna correspondiente, en este ltimo caso
2 de 3 04/12/11 23:42

QGrid Layout. Organizar los Widgets en Forma Tabular

http://www.zonaqt.com/book/export/html/289

(que es lo que ha ocurrido en los dos ejemplos anteriores) el QGridLayout asigna automticamente el alto/ancho mnimo de esta la/columna con un valor igual al mnimo requerido por el widget en cuestin. Podemos establecer el ancho mnimo de una columna y el alto mnimo de una la con las funciones:
setColumnMinimumWidth(int columna, int anchoMinimo ) setRowMinimumHeight(int fila, int altoMinimo)

Por ejemplo si aadieramos los botones al layout mediante el siguiente cdigo:


layout->addWidget(boton1, 0, 0); layout->addWidget(boton2, 1, 1); layout->addWidget(boton3, 3, 3);

Se crearan cuatro las y cuatro columnas, es decir, una la y columna ms que en el ejemplo anterior, pero al ejecutar el programa obtendramos el mismo resultado que se muestra en la imagen pasada. Esto ocurre debido a que aunque la la y columna con el nmero dos existen, estas tienen un alto y ancho de cero ya que no hemos colocado ningn widget en ellas ni hemos establecido el tamao mnimo para ellas. Pero si despus de la lnea dnde agregamos el ltimo botn al layout aadimos las lneas:
layout->setColumnMinimumWidth(2, 60); layout->setRowMinimumHeight(2, 20);

Obtendramos el siguiente resultado:

3 de 3

04/12/11 23:42

QFormLayout. Organizar los Widgets a Manera de Form...

http://www.zonaqt.com/book/export/html/290

QFormLayout. Organizar los Widgets a Manera de Formulario


El QFormLayout nos permite ordenar los widgets de manera similar a la de formulario web, es decir, las compuestas por un par de widgets, los cuales normalmente son una etiqueta y un campo de texto.

El cdigo para crear una aplicacin con un layout como el de la imagen anterior es el siguiente:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. #include #include #include #include #include <QObject> <QApplication> <QDialog> <QFormLayout> <QPushButton>

int main(int argc, char *argv[]) { QApplication app(argc, argv); QDialog ventana; QFormLayout *layout QPushButton *boton1 QPushButton *boton2 QPushButton *boton3

= = = =

new new new new

QFormLayout(&ventana); QPushButton(QObject::trUtf8("Botn 1")); QPushButton(QObject::trUtf8("Botn 2")); QPushButton(QObject::trUtf8("Botn 3"));

layout->addRow(QObject::trUtf8("Botn 1:"), boton1); layout->addRow(QObject::trUtf8("Botn 2:"), boton2); layout->addRow(QObject::trUtf8("Botn 3:"), boton3); ventana.setWindowTitle("QVBoxLayout");

1 de 2

04/12/11 23:43

QFormLayout. Organizar los Widgets a Manera de Form...


22. 23. 24. 25. } ventana.show(); return app.exec();

http://www.zonaqt.com/book/export/html/290

En este caso nuestro layout ser del tipo QFormLayout y para aadir widgets utilizarermos la funcin
addRow(QLabel *etiqueta, QWidget *widget)

aunque tambin es posible utilizar la siguiente funcin sobre cargada, con el n de evitar que nosotros tengamos que crear una etiqueta para cada uno de los widgets que deseeemos agregar:
addRow(const QString &amp;texto, QWidget *widget)

17. 18. 19.

layout->addRow(QObject::trUtf8("Botn 1:"), boton1); layout->addRow(QObject::trUtf8("Botn 2:"), boton2); layout->addRow(QObject::trUtf8("Botn 3:"), boton3);

En las lneas 17 a 19 agregamos los widgets al layout, utilizamos la versin sobrecargada de addRow() en la que el primer parmetro es una cadena de texto con el n de ahorrar cdigo, debido a que en este ejemplo no necesitamos que el texto de alguna la cambie y por lo tanto no es necesario conservar un apuntador hacia las etiquetas. Este tipo de layout es muy til, por ejemplo, en la creacin de formularios para la solicitud de informacin (como un registro de usuarios o un formulario de comentarios) en dnde debemos de indicar que informacin debe de capturar el usuario en cada campo.

2 de 2

04/12/11 23:43

Layouts Anidados. Interfaces de Usuario Complejas en Qt

http://www.zonaqt.com/book/export/html/291

Layouts Anidados. Interfaces de Usuario Complejas en Qt


Normalmente las aplicaciones que desarrollemos no tendrn una interfaz tan sencilla como para ser diseadas utilizando slo un layout, para organizar los widgets de maneras ms complejas utilizamos layouts anidados, es decir, un layout dentro de otro. La funcin que nos permite anidar layouts depende del tipo de layout que estemos utilizando, para QHBoxLayout y QVBoxLayout la funcin es:
addLayout(QLayout *layout, int Qt::Alignment align=0)

Para el QGridLayout adems debemos especicar la la y columna de la celda dnde deseamos agregar el layout, de la siguiente forma
addLayout(QLayout *layout, int fila, int columna, Qt::Alignment align=0)

Para el QFormLayout se utiliza una funcin sobrecargada de addRow(), en una de las siguientes formas, dependiendo de la apariencia que deseemos lograr:
addRow(QLabel *label, QLayout *layout) addRow(QString &texto, QLayout *layout)

Est funcin recibe como parmetros un apuntador a la etiqueta que contiene el texto que describe al layout o simplemente una QString con ese texto y un apuntador al layout que deseamos agregar.
addRow(QLayout *layout)

Esta funcin recibe cmo parmetro un apuntador al layout que deseamos agregar. A continuacin mostraremos un sencillo ejemplo de anidacin de layouts para crear una interfaz de usuario muy conocida: un formulario de inicio de sesin.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. #include #include #include #include #include #include #include <QApplication> <QHBoxLayout> <QVBoxLayout> <QLabel> <QLineEdit> <QPushButton> <QDialog>

int main(int argc, char *argv[]) { QApplication app(argc, argv);

1 de 4

04/12/11 23:43

Layouts Anidados. Interfaces de Usuario Complejas en Qt


12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. }

http://www.zonaqt.com/book/export/html/291

QDialog ventana; QHBoxLayout *layoutUsuario = new QHBoxLayout; QHBoxLayout *layoutContrasenia = new QHBoxLayout; QHBoxLayout *layoutBotones = new QHBoxLayout; QVBoxLayout *layoutPrincipal = new QVBoxLayout(&ventana); QLabel *etiquetaUsuario = new QLabel("Usuario"); QLabel *etiquetaContrasenia = new QLabel("Password"); QLineEdit *campoUsuario = new QLineEdit; QLineEdit *campoContrasenia = new QLineEdit; QPushButton *botonAceptar = new QPushButton("Aceptar"); QPushButton *botonCancelar = new QPushButton("Cancelar"); layoutUsuario->addWidget(etiquetaUsuario); layoutUsuario->addWidget(campoUsuario); layoutContrasenia->addWidget(etiquetaContrasenia); layoutContrasenia->addWidget(campoContrasenia); layoutBotones->addStretch(); layoutBotones->addWidget(botonAceptar); layoutBotones->addWidget(botonCancelar); layoutPrincipal->addLayout(layoutUsuario); layoutPrincipal->addLayout(layoutContrasenia); layoutPrincipal->addLayout(layoutBotones); ventana.setWindowTitle(QObject::trUtf8("Iniciar Sesin")); ventana.show(); return app.exec();

Al ejecutar este cdigo obtendremos una salida parecida a la siguiente imagen

En las lneas 1 a 7 incluimos los archivos de cabecera necesarios para desarrollar la aplicacin, mientras que en las lneas 13 a 26 creamos los widgets que utilizaremos. En las lneas 28 y 29 colocamos los widgets del campo usuario en un QHBoxLayout, lo mismo hacemos para los campos de contrasea y para los botones. Con el n de lograr una interfaz ms agradable alineamos los botones a la derecha insertando un espacio en blanco al principio del QHBoxLayout mediante la instruccin
addStretch(int stretch=0); 38. 39. 40. layoutPrincipal->addLayout(layoutUsuario); layoutPrincipal->addLayout(layoutContrasenia); layoutPrincipal->addLayout(layoutBotones);

2 de 4

04/12/11 23:43

Layouts Anidados. Interfaces de Usuario Complejas en Qt

http://www.zonaqt.com/book/export/html/291

A partir de la lnea 38 agregamos en el layout principal (el cual es un QVBoxLayout) el layout que contiene los controles de usuario, seguido por el que contiene los controles de contrasea y por ltimo el que contiene los botones. Es posible disear una interfaz de usuario utilizando distintas combinaciones de layouts, es cuestin de tiempo y experiencia poder encontrar aquella que sea ms fcil y rpida de crear o la que se adapte mejor a las necesidades de nuestra aplicacin. Para el ejemplo anterior un mejor diseo (considerando que requiere menos lneas) puede lograrse utilizando un QFormLayout en lugar de los primeros dos QHBoxLayout. El cdigo es el siguiente:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. #include #include #include #include #include #include <QApplication> <QHBoxLayout> <QFormLayout> <QLineEdit> <QPushButton> <QDialog>

int main(int argc, char *argv[]) { QApplication app(argc, argv); QDialog ventana; QHBoxLayout *layoutBotones = new QHBoxLayout; QFormLayout *layoutPrincipal = new QFormLayout(&ventana); QLineEdit *campoUsuario = new QLineEdit(); QLineEdit *campoContrasenia = new QLineEdit(); QPushButton *botonAceptar = new QPushButton("Aceptar"); QPushButton *botonCancelar = new QPushButton("Cancelar"); layoutBotones->addStretch(); layoutBotones->addWidget(botonAceptar); layoutBotones->addWidget(botonCancelar); layoutPrincipal->addRow(QString("Usuario"), campoUsuario); layoutPrincipal->addRow(QString("Password"), campoContrasenia); layoutPrincipal->addRow(layoutBotones); ventana.setWindowTitle(QObject::trUtf8("Iniciar Sesin")); ventana.setWindowFlags(Qt::Window); ventana.show(); return app.exec(); }

Al ejecutar este cdigo obtenemos una salida similar a la siguiente

La cual tiene una apariencia muy similar a la del ejemplo anterior pero que luce un
3 de 4 04/12/11 23:43

Layouts Anidados. Interfaces de Usuario Complejas en Qt

http://www.zonaqt.com/book/export/html/291

poco mejor en algunos aspectos, lo relevante para este ejemplo es que el nmero de lneas utilizadas se redujo un poco, y es de suponer que en una aplicacin de mayor tamao el ahorro de lneas de cdigo tambin ser mayor.

4 de 4

04/12/11 23:43

Signals y Slots. Implementando la Funcionalidad de una ...

http://www.zonaqt.com/book/export/html/292

Signals y Slots. Implementando la Funcionalidad de una Aplicacin Qt


En la parte anterior de este tutorial vimos como utilizar layouts para disear la interfaz grca de nuestras aplicaciones y para ejemplicarlo diseamos un dilogo de inicio de sesin.

En esta parte del tutorial aprenderemos a implementar la funcionalidad de nuestras aplicaciones utilizando Seales y Slots, los cuales forman el mecanismo a travs del cual los objetos de una aplicacin de Qt (incluyendo widgets) se comunican. Este mecanismo es una de la caractersticas distintivas de Qt, ya que otros frameworks suelen utilizar un enfoque basado en callbacks. Una seal es una noticacin que un objeto emite cundo cambia su estado de manera que podra interesarle a otros objetos. Un slot es una funcin que se ejecuta cundo una seal se emite. Cualquier objeto en el que deseemos implementar seales y slots debe de heredar de la clase QObject, los widgets que utilizaremos normalmente cumplen con esto ya que heredan de QWidget que a su vez hereda de QObject. Los widgets que nos proporciona Qt poseen seales y slots predenidos, pero tambin es posible crear un widget

1 de 7

04/12/11 23:44

Signals y Slots. Implementando la Funcionalidad de una ...

http://www.zonaqt.com/book/export/html/292

personalizado con el n de aadir nuestras propias seales y slots. A continuacin mostramos el cdigo de nuestra aplicacin de inicio de sesin, en el cul utilizamos seales y slots para implementar su funcionalidad, esto es que al capturar un nombre de usuario registrado y su contrasea correspondiente se nos permita el acceso a una seccin restringida de una aplicacin y que al capturar un nombre de usuario no registrado o una contrasea no coincidente se niegue el acceso. En este ejemplo utilizaremos dos seales y dos slots, recordemos que las seales se emiten cundo un objeto cambia de estado de manera interesante para otros objetos, en este caso sern emitidas cuando se presione alguno de los botones; Cada una de estas seales est conectada a un slot diferente, el cual se ejecuta cuando el botn respectivo es presionado. Ms adelante veremos el cdigo de estos slots. En esta ocasin nuestra aplicacin se compone de tres archivos, un archivo de denicin de la clase, uno de implementacin y un archivo main, denimos una nueva clase debido a que necesitamos un dilogo personalizado para implementar el slot que se ejecutar cundo se presione el botn Aceptar en nuestra ventana de login, el slot que se ejecuta cuando se presiona el botn cancelar (close() el cual cierra la ventana) ya est predenido. NOTA: Slo revisaremos a detalle las secciones que no hayan sido explicadas en partes anteriores del tutorial o que sean relevantes para esta explicacin El contenido de login.h, el archivo de denicin de clase, es el siguiente:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. #ifndef LOGIN_H #define LOGIN_H #include <QDialog> class QPushButton; class QLineEdit; class Login : public QDialog { Q_OBJECT public: Login(QWidget *parent=0); private slots: void verificarDatos(); private: QPushButton *botonAceptar, *botonCancelar; QLineEdit *campoUsuario, *campoPassword; }; #endif // LOGIN_H

#include <QDialog>

En la lnea 4 incluimos el archivo de cabecera de QDialog el cul necesitamos debido a que nos basaremos en l para construir nuestro dilogo.
class QPushButton; class QLineEdit;

2 de 7

04/12/11 23:44

Signals y Slots. Implementando la Funcionalidad de una ...

http://www.zonaqt.com/book/export/html/292

En las lneas 6 y 7 indicamos al compilador que utilizaremos las clases QPushButton y QLineEdit, pero no especicamos sus detalles, los cuales se encuentran en sus archivos .h propios, es posible hacer esto debido a que declaramos las variables como tipo apuntador y a que en este archivo slo las denimos pero no las utilizamos. Tambin hubiera sido posible incluir los archivos de cabecera pero el slo indicar el nombre de las clases permite reducir el tiempo de compilacin.
class Login : public QDialog

En la lnea 9 denimos nuestra nueva clase, la cual tendr el nombre de Login y heredar de QDialog.
Q_OBJECT

En la lnea 11 utilizamos una macro llamada Q_OBJECT la cual es necesaria en cada clase que utilice seales y slots. Esta macro dene algunas funciones de instrospeccin utilizadas por otras funciones como connect() y es necesaria para que el cdigo de Qt sea traducido por el compilador meta objeto (moc, por sus siglas en ingls) a cdigo C++ estndar.
public: Login();

A partir de la lnea 13 declalramos las funciones y los miembros de nuestra clase. En la lnea 14 declaramos el constructor de nuestra clase.
void verificar();

En la lnea 17 denimos nuestro slot personalizado, el cual lleva por nombre vericarDatos(), se ejecuta cundo se presione el botn Aceptar y como su nombre lo indica se encarga de vericar que los datos ingresados sean correctos.
QPushButton *botonAceptar, *botonCancelar; QLineEdit *campoUsuario, *campoPassword;

En las lneas 20 y 21 declaramos los widgets que utilizaremos en nuestra aplicacin, dos campos de texto, uno para el nombre de usuario y otro para la contrasea y dos botones, uno para solicitar la vericacin de los datos capturados y otro para salir, que slo se provee por comodidad. El contenido del archivo login.cpp es el siguiente:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. #include "login.h" #include #include #include #include #include #include <QApplication> <QPushButton> <QLineEdit> <QFormLayout> <QHBoxLayout> <QMessageBox>

Login::Login(QWidget *parent) : QDialog(parent) {

3 de 7

04/12/11 23:44

Signals y Slots. Implementando la Funcionalidad de una ...


13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. QFormLayout *layoutPrincipal = new QFormLayout; QHBoxLayout *layoutBotones = new QHBoxLayout; botonAceptar = new QPushButton(trUtf8("Aceptar")); botonCancelar = new QPushButton(trUtf8("Cancelar")); campoUsuario = new QLineEdit(); campoPassword = new QLineEdit(); layoutBotones->addStretch(); layoutBotones->addWidget(botonAceptar); layoutBotones->addWidget(botonCancelar);

http://www.zonaqt.com/book/export/html/292

layoutPrincipal->addRow(trUtf8("Usuario"), campoUsuario); layoutPrincipal->addRow(trUtf8("Contrasea"), campoPassword); layoutPrincipal->addRow(layoutBotones); setLayout(layoutPrincipal); connect(botonAceptar, SIGNAL(clicked()), this, SLOT(verificarDatos())); connect(botonCancelar, SIGNAL(clicked()), this, SLOT(close())); } void Login::verificarDatos() { if(campoUsuario->text() == "zonaqt" && campoPassword->text() == "zonaqt"){ QMessageBox::information(this, "", trUtf8("Bienvenido a la aplicacin")); QApplication::quit(); } else QMessageBox::warning(this, "", trUtf8("La combinacin usuario/contrasea no es vlida")); }

#include "login.h"

En la lnea 1 incluimos el archivo de denicin de nuestra clase.


Login::Login() { QFormLayout *layoutPrincipal = new QFormLayout; QHBoxLayout *layoutBotones = new QHBoxLayout; ...

En la lnea 10 comienza la implementacin del constructor de nuestra clase, en l inicializamos los widgets y layouts necesario para la aplicacin y denimos la apariencia de nuestro widget de la misma forma que hicimos en la seccin anterior del tutorial.
connect(botonAceptar, SIGNAL(clicked()), this, SLOT(verificar())); connect(botonCancelar, SIGNAL(clicked()), this, SLOT(close()));

Las lneas 30 y 31 son las que presentan novedades. En ellas utilizamos la funcin:
connect(QObject *emisor, const char *signal, QObject *receptor, const char *slot,

4 de 7

04/12/11 23:44

Signals y Slots. Implementando la Funcionalidad de una ...


Qt::ConnectionType type=Qt::AutoConnection);

http://www.zonaqt.com/book/export/html/292

La funcin connect es la encargada de conectar o enlazar dos QObjects, recibe como parmetros un apuntador al QObject emisor de la seal de inters, un apuntador a un arreglo de caracteres que indica la rma de funcin de la seal que nos interesa monitorear, un apuntador al QObject receptor de la seal y otro apuntador a un arreglo de caracteres, esta vez con la rma de funcin del slot que se ejecutar cundo se emita la seal indicada. Las macros SIGNAL() y SLOT() son requeridas por el moc al indicar el segundo y cuarto parmetro, respectivamente. Es necesario que las rmas de las funciones indicadas en estas macros coincidan en sus parmetros. Con la excepcin de que la seal indicada puede tener ms parmetros que los requeridos por el slot, en este caso los parmetros adicionales son ignorados. Al utilizar la funcin connect() se pueden presentar los siguientes casos: Cada seal est conectada a un slot distinto. Este es el caso ms simple y es el que mostramos en este ejemplo, en l el slot que se ejecuta depende de la seal que se emite. Ms de una seal puede estar conectada a un slot. En este caso el slot se ejecutar cundo se emita cualquiera de las seales conectadas a l. Una seal puede estar conectada a ms de un slot. En este caso todos los slots conectados a la seal en cuestin se ejecutarn cundo dicha seal se emita, uno tras otro en un orden indeterminado. Una seal puede estar conectada a otra seal. En este caso la seal indicada en el cuarto parmetro se emitir al emitirse la indicada en el segundo parmetro.
void Login::verificar()

En la lnea 34 comienza la implementacin de nuestro slot personalizado, indicamos el tipo de dato de retorno, despus la clase a la que pertenece seguido del nombre del slot y su lista de parmetros, en este caso no ningn parmetro es requerido.
if(campoUsuario->text() == "zonaqt.com" && campoPassword->text() == "zonaqt.com"){ QMessageBox::information(this, "", trUtf8("Bienvenido a la aplicacin")); emit exit(0); } else QMessageBox::warning(this, "", trUtf8("La combinacin usuario/contrasea no es vlida"));

En la lnea 36 vericamos que la informacin capturada en los campos de texto coincida con la informacin de algn usuario registrado, en este caso y para mantener la simpleza indicamos en el cdigo un nico usuario: programacion, y su contrasea correspondiente: linux. La funcin QLineEdit::text() devuelve una QString con el contenido del QLineEdit en cuestin, en este caso el nombre de usuario para campoUsuario y la contrasea para campo Password. QString es una clase de Qt que representa una cadena de caracteres unicode y que nos proporciona funciones bastante tiles como concatenacin, traduccin o bsqueda y reemplazo de caracteres, entre otras. En caso de que la informacin capturada sea correcta mostramos un mensaje de bienvenida o conrmacin y cerramos esta ventana para mostrar la ventana principal, debido a que en este momento slo tenemos una ventana entonces
5 de 7 04/12/11 23:44

Signals y Slots. Implementando la Funcionalidad de una ...

http://www.zonaqt.com/book/export/html/292

salimos de la aplicacin. En caso de que la informacin capturada sea incorrecta mostramos un mensaje de aviso informando que hubo un error. Los mensajes de bienvenida o error, son mostrados al usuario utilizando las funciones estticas de la clase QMessageBox
StandarButton QMessageBox::information(QWidget *padre, const QString &titulo, const QString &mensaje, StandarButtons boton=Ok, StandarButton botonPredeterminado=NoButton)

Esta funcin la utilizamos para mostrar un dilogo como el siguiente:


StandarButton QMessageBox::warning(QWidget *padre, const QString &titulo, const QString &mensaje, StandarButtons botones=Ok, StandarButton botonPredeterminado=NoButton)

Esta funcin la utilizamos para mostrar un dilogo como el siguiente: Estas funciones permiten mostrar un dilogo para mostrar informacin relevante o hacer una pregunta al usuario y recibir una respuesta. Estas funciones reciben como parmetros obligatorios: Un apuntador al QWidget padre, que en este caso es nuestra ventana de login lo cual indicamos con la instruccin this; Una cadena de texto que ser el ttulo del mensaje; Y una cadena de texto que aparecer en el contenido del QMessageBox. Y como parmetros opcionales: Un conjunto de valores de la enumeracin StandarButtons, que representan los botones que la QMessageBox incluir y un elemento de la enumeracin StandarButtons el cual representa al botn por default de la QMessageBox, es decir, el cual cambiar su estado a presionado (emitir la seal clicked()) al presionar la tecla enter, en caso de no especicar estos parmetros se seleccionar por defecto el botn Ok. El contenido del archivo main.cpp es el siguiente
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. #include <QApplication> #include "login.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Login *login = new Login(); login->show(); return app.exec(); }

#include "login.h"

En la lnea 2 incluimos el archivo de denicin de nuestra clase Login.


Login login;

login.show();

Y nalmente en la lnea 8 creamos e inicializamos un objeto de nuestra clase


6 de 7 04/12/11 23:44

Signals y Slots. Implementando la Funcionalidad de una ...

http://www.zonaqt.com/book/export/html/292

login, el cual mostramos en la lnea 10.

7 de 7

04/12/11 23:44

QMainWindow. La ventana principal de una aplicacin

http://www.zonaqt.com/book/export/html/293

QMainWindow. La ventana principal de una aplicacin


En el artculo anterior de este tutorial vimos como implementar la funcionalidad de una aplicacin grca de Qt utilizando seales y slots. En este artculo revisaremos a detalle un widget especial, QMainWindow, el cul posee caractersticas especiales para ser utilizado como la ventana principal de las aplicaciones Qt. La estructura de la QMainWindow se puede ver en la siguiente imagen Diagrama

Una QMainWindow puede estar compuesta de las siguientes cinco reas o secciones: Menu Bar Como su nombre lo indica esta barra contiene mens, los cuales estn compuestos por elementos de texto o etiquetas que indican las acciones que puede realizar la aplicacin y que se ejecutan al hacer clic sobre ellas. Normalmente slo existe una de ellas en la ventana y est colocada en la parte superior, debajo de la barra de ttulo. Algunos ejemplos muy conocidos de mens que suelen colocarse en esta barra son Archivo, Edicin, Herramientas o Ayuda. Toolbars Al igual que la barra de mens, esta clase de barras, conocida como barra de herramientas est compuesta por las acciones que puede realizar la aplicacin, con la diferencia de que en esta barra dichas acciones se muestran mediante iconos en lugar de etiquetas. Estas barras suelen estar ubicadas debajo de la barra de mens y podemos encontrar una o ms de estas barras en una ventana. Un ejemplo muy conocido de iconos colocados en este tipo de barras son los de Guardar, representado por un diskette o Imprimir, representado por una impresora. Status Bar Esta barra, conocida como barra estatus o de estado, normalmente est colocada en la parte inferior de la ventana, en ella se muestran mensajes informativos sobre el estado de la aplicacin, las acciones que est realizando o la descripcin del elemento al que estemos apuntando con el mouse. Dock Widgets Este es un tipo de widgets que pueden ser acoplados o ajustados alrededor del widget central de una aplicacin o permitir que oten libremente en el escritorio, al igual que las barras de herramientas contienen iconos y botones que permiten ejecutar acciones que proporciona la aplicacin. Central Widget Este widget representa el rea de trabajo de una aplicacin, como la tabla de celdas de una aplicacin en hoja de clculo o el rea de texto de un procesador de textos. Podemos reconocer ests secciones en un buen nmero de aplicaciones, como ejemplo presentamos la ventana de Open Oce Writer (clic para ampliar). A continuacin mostraremos un sencillo ejemplo de una aplicacin que basada en una QMainWindow, la cual contendr una etiqueta como widget central la cual cambiar el texto que muestra dependiendo de la accin que ejecutemos, estas acciones se encontrarn en una barra de mens y una barra de herramientas tambin incluiremos una barra de estatus. La aplicacin est compuesta por los siguientes tres archivos: ventanaprincipal.h es el archivo de encabezado de la clase VentanaPrincipal, contiene la declaracion de las variables y la denicin de las funciones que utilizaremos en esta aplicacin. ventanaprincipal.cpp es el archivo fuente de la clase VentanaPrincipal, contiene la implementacin de las funciones declaradas en el archivo de encabezado. main.cpp A continuacin revisaremos a detalle los archivos de la aplicacin, slo explicaremos las secciones que no hayan sido revisadas en partes anteriores de este tutorial o que sean relevantes en este contexto ventanaprincipal.h
1. #ifndef VENTANAPRINCIPAL_H 2. #define VENTANAPRINCIPAL_H 3. 4. #include <QMainWindow> 5.

1 de 5

04/12/11 23:44

QMainWindow. La ventana principal de una aplicacin


6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. class class class class QLabel; QToolBar; QAction; QMenu;

http://www.zonaqt.com/book/export/html/293

class VentanaPrincipal : public QMainWindow { Q_OBJECT public: VentanaPrincipal(QWidget *parent=0); private slots: void accionNuevoLanzada(); void accionAbrirLanzada(); void accionAcercaDeLanzada(); void accionSalirLanzada(); private: QMenu* menuArchivo; QMenu* menuAyuda; QToolBar* barraDeHerramientas; QAction* accionNuevo; QAction* accionAbrir; QAction* accionAcercaDe; QAction* accionSalir; QLabel* widgetCentral; }; #endif

En la lnea 4 incluimos el archivo de cabecera QMainWindow el cual contiene la denicin de la clase en la que basaremos nuestra ventana principal. En la lnea 11 comenzamos con la denicin de nuestra clase VentanaPrincipal e indicamos que heredar de QMainWindow. De la lneas 18 a 22 declaramos los slots por medio de los cuales implementaremos la funcionalidad de nuestra aplicacin. Y nalmente de las lneas 24 a 32 declaramos las variables que utilizaremos en la aplicacin.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. #include "ventanaprincipal.h" #include #include #include #include #include <QMenuBar> <QToolBar> <QLabel> <QStatusBar> <QMessageBox>

VentanaPrincipal::VentanaPrincipal(QWidget *parent) :QMainWindow(parent) { menuArchivo = menuBar()->addMenu(trUtf8("&Archivo")); menuAyuda = menuBar()->addMenu(trUtf8("A&yuda")); barraDeHerramientas = addToolBar(trUtf8("&Archivo")); widgetCentral = new QLabel(trUtf8("Widget central")); widgetCentral->setFont(QFont("Sans-Serif", 25)); accionNuevo = new QAction(QIcon("iconos/nuevo.png"), trUtf8("&Nuevo"), this); accionNuevo->setShortcut(QKeySequence::New); accionNuevo->setStatusTip(trUtf8("Crear un nuevo archivo")); accionAbrir = new QAction(QIcon("iconos/abrir.png"), trUtf8("&Abrir"), this); accionAbrir->setShortcut(QKeySequence::Open); accionAbrir->setStatusTip(trUtf8("Abrir un archivo existente")); accionSalir = new QAction(QIcon("iconos/salir.png"), trUtf8("&Salir"), this); accionSalir->setShortcut(QKeySequence::Quit); accionSalir->setStatusTip(trUtf8("Salir de la aplicacin")); accionAcercaDe = new QAction(QIcon("iconos/salir.png"), trUtf8("&Acerca de"), this); accionAcercaDe->setShortcut(QKeySequence("Ctrl+d")); accionAcercaDe->setStatusTip(trUtf8("Informacin sobre esta aplicacin")); menuArchivo->addAction(accionNuevo); menuArchivo->addAction(accionAbrir); menuArchivo->addSeparator(); menuArchivo->addAction(accionSalir); menuAyuda->addAction(accionAcercaDe); barraDeHerramientas->addAction(accionNuevo); barraDeHerramientas->addAction(accionAbrir); barraDeHerramientas->addSeparator(); barraDeHerramientas->addAction(accionSalir); setCentralWidget(widgetCentral); statusBar()->showMessage(trUtf8("Bienvenido")); setWindowTitle("Ventana Principal"); setMinimumSize(200, 200); connect(accionNuevo, SIGNAL(triggered()), this, SLOT(accionNuevoLanzada())); connect(accionAbrir, SIGNAL(triggered()), this, SLOT(accionAbrirLanzada())); connect(accionAcercaDe, SIGNAL(triggered()), this, SLOT(accionAcercaDeLanzada())); connect(accionSalir, SIGNAL(triggered()),

2 de 5

04/12/11 23:44

QMainWindow. La ventana principal de una aplicacin


63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. this, SLOT(accionSalirLanzada())); } void VentanaPrincipal::accionNuevoLanzada() { widgetCentral->setText(trUtf8("Accin \"Nuevo\" lanzada")); this->resize(QSize(widgetCentral->sizeHint().width(), 200)); } void VentanaPrincipal::accionAbrirLanzada() { widgetCentral->setText(trUtf8("Accin \"Abrir\" lanzada")); this->resize(QSize(widgetCentral->sizeHint().width(), 200)); }

http://www.zonaqt.com/book/export/html/293

void VentanaPrincipal::accionAcercaDeLanzada() { QMessageBox::about(this, this->windowTitle(), trUtf8("Aqu se debe colocar informacin sobre la aplicacin y la compaia que la desarolla\n\nForto, tutoriales y noticia } void VentanaPrincipal::accionSalirLanzada() { exit(0); }

De las lneas 1 a 7 incluimos los archivos de cabecera necesarios para implementar la aplicacin. En las lnea 12 inicializamos la variable menuArchivo la cual representa un men que podemos incluir en la barra de mens de la QMainWindow, para lograrlo utilizamos las funciones
QMenuBar* QMainWindow::menuBar()

Devuelve una referencia a una barra de mens que es creada al llamar a la funcin por primera vez.
QMenu* QMenuBar::addMenu(QString &texto)

Devuelve una referencia a un men que se crear al llamar a la funcin y que mostrar en pantalla el texto indicado en la cadena de caracteres que se pasa como parmetro. En la lnea 13 realizamos lo mismo para el men Ayuda. En la lnea 15 inicializamos la variable que representa a una barra de herramientas. La funcin utilizada es:
QToolBar* QMainWindow::addToolBar(QString &texto);

y trabaja de manera muy similar a las descritas anteriormente, es decir, devuelve una referencia a una QToolBara que se crea cuando se llama a la funcin y que mostrar en pantalla la cadena que se pasa como parmetro. En la lnea 17 inicializamos la etiqueta que ser utilizada como widget central en la aplicacin. Y en la lnea 18 establecemos la fuente que queremos que ocupe la etiqueta, esto se hace mediante la instruccin:
QLabel::setFont(QFont(QString &fuente, int tamanio));

La cual recibe como parmetros un objeto QFont, el cual representa una fuente de texto y que a su vez recibe como parmetros el nombre de la fuente y el tamao de la misma. En la lnea 20 inicializamos nuestra variable accionNuevo, del tipo QAction, mediante el constructor de la clase
QAction::QAction(QIcon(QString &archivo), QString &texto, QWidget* padre)

Este constructor recibe como parmetros un objeto QIcon, el cual representa un icono que se mostrar cuando la accin sea colocada dentro de una barra de herramientas y que a su vez recibe como parmetro una cadena de texto con la direccin dnde se encuentra el archivo de imagen que mostrar el icono, el segundo parmetro del constructor de la clase QAction es una cadena que indica el texto que se mostrar cuando la accin sea colocada dentro de una barra de mens y el ltimo parmetro es el widget padre de la accin. QAction Antes de seguir debemos denir el concepto de QAction: Una QAction es una representacin abstracta de un comando de la aplicacin que puede ser ejecutado por el usuario. En muchas aplicaciones los mismos comandos, acciones o funciones pueden ser ejecutados de diferentes maneras, ya sea mediante un elemento de la barra de mens, un icono de alguna barra de herramientas o una combinacin de teclas, por mencionar algunos ejemplos. Una QAction nos es muy til en este tipo de situacin ya que puede estar asociada a mltiples widgets, gracias a esto ser posible proporcionar la misma funcin en distintos lugares de la aplicacin y de manera sincronizada, entonces podemos decir que una QAction proporciona una interfaz comn para la ejecucin de los comandos de la aplicacin. Siguiendo con el cdigo, en la lnea 21 establecemos un atajo de teclado para nuestra accin Nuevo, mediante la funcin
QAction::setShortcut(const QKeySecuence secuencia)

la cual recibe como parmetro un elemento de la enumeracin QKeySecuence, dicha enumeracin nos proporciona combinaciones estndar de teclas dependiendo de la conguracin del sistema operativo en el que nos encontremos. Por ejemplo en el caso de mi sistemas operativo el elemento QKeySecuence::New esta relacionado con la combinacin de teclas Ctrl+N sin embargo esto puede ser distinto en otro sistema operativo, pero al utilizar esta enumeracin Qt se encargar de administrarlo y en caso de que se requiera, asociarlo a otra combinacin de teclas ms adecuada en esa situacin. En la lnea 22 establecemos el texto que deseamos que se muestre en la barra de estatus al posicionar el cursor del mouse sobre los widgets relacionados con la accin correspondiente. Esto se logra mediante la funcin:
QAction::setStatusTip(QString &texto)

3 de 5

04/12/11 23:44

QMainWindow. La ventana principal de una aplicacin


La cual recibe como parmetro una cadena con el texto que deseamos mostrar. En las lneas 24 a 34 realizamos lo mismo para las acciones restantes.

http://www.zonaqt.com/book/export/html/293

En las lneas 36 a 39 agregamos tres de las acciones que creamos al men Archivo. Esto lo hacemos a travs de la funcin
QMenu::addAction(QAction* accion)

Con el n de lograr un diseod e interfaz de usuario ms claro y atractivo en la lnea 38 agregamos un separardor, utilizando la funcin
QMenu::addSeparator()

Un separador es una lnea vertical u horizontal que separa las acciones que est colocadas dentro del mismo men o barra de herramientas pero que pueden ser ubicadas en una categora especca o diferente del resto de las acciones del mismo men o barra de herramientas. En la lnea 41 agregamos la accin AcercaDe al men Ayuda. En las lneas 43 a 46 agregamos las acciones a la barra de herramientas de la aplicacin utilizando las mismas funciones que utilizamos para agregarlas a los mens. En la lnea 49 creamos la barra de estatus mediante la funcin
QMainWindow::statusBar()

La cual funciona de manera muy similar a las funciones utilizadas para crear las otras barras de la ventana principal, es decir, crear una barra de estatus para la ventana la primera vez que es llamada. En la misma lnea utilizamos la funcin
QStatusBar::showMessage(QString &mensaje)

para mostrar un mensaje en la barra de estatus, en este caso mostramos la palabra Listo con el n de indicar que la aplicacin puede comenzar a utilizarse. En las lneas 53 y 54 conectamos la accin accionNuevo con su slot correspondiente, esto lo realizamos mediante la funcin connect(), la cual revisamos a detalle en un artculo anterior. Debido a que una accin puede estar asociada a mltiples widgets no siempre ser lanzada de la misma forma, debido a ello Qt nos proporciona la seal triggered() (lanzada o disparada) la cual se emitir cada vez que un widget asociado a la seal sea activado, por ejemplo un clic sobre un botn lanzar una accin asociada al mismo mientras que una combinacin de teclas lanzar dicha accin al ser presionada por el usuario. En las lneas 56 a 63 conectamos las acciones restantes a sus respectivos slots. En la lnea 66 comienza la implementacin de los slots, los slots accionNuevoLanzada y accionAbriLanzada cambiarn el texto que se muestra en la etiqueta utilizada como widget central y redimensionarn la ventana para ajustarla al nuevo texto mostrado. El cambio de texto de la etiqueta se realiza mediante la funcin
QLabel::setText(QString &texto)

la cual recibe como parmetro una cadena de caracteres con el texto que se desea mostrar. El cambio de tamao de la ventana se realiza mediante la funcin
QMainWindow::resize(QSize(int width, int height))

esta funcin recibe como parmetro un objeto QSize, el cual es una estructura que incluye el ancho y alto de un widget y que a su vez recibe como parmetros dos enteros indicando el ancho y alto del widget, respectivamente. Tambin utilizamos la funcin sizeHint() la cual devuelve un objeto QSize con el tamao requerido por el widget sobre el que se llamo la funcin. En la lnea 78 comienza la implementacin del slot asociado a la accin acercaDe, en la lnea 80 indicamos que al dispararse dicha accin se mostrar el conocido dilogo acerca de el cul contiene informacin sobre la aplicacin como versino fecha de lanzamiento y sobre la compaia que creo la aplicacin. Finalmente en las lneas 83 a 86 implementamos el slot asociado a la accin salir, en la lnea 85 utilizamos la funcin exit(int codigo) para indicar que deseamos salir de la aplicacin, la aplicacin devolver un cdigo el cdigo de error indicado como parmetro. Normalmente un valor de cero indica que la aplicacin termino normalmente, es decir, sin ningn error. main.cpp
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. #include <QApplication> #include "ventanaprincipal.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); VentanaPrincipal w; w.show(); return a.exec(); }

En la lnea 1 incluimos el archivo de cabecera de la clase VentanaPrincipal, mientras que en la lnea 8 creamos e inicializamos un objeto de dicha clase, y nalmente en la lnea 10 mostramos nuestra ventana principal. Al ejecutar esta aplicacin de ejemplo obtendremos algo parecido a lo mostrado en las siguientes imagenes:

4 de 5

04/12/11 23:44

QMainWindow. La ventana principal de una aplicacin

http://www.zonaqt.com/book/export/html/293

5 de 5

04/12/11 23:44

Dilogos modales y no modales.

http://www.zonaqt.com/book/export/html/294

Dilogos modales y no modales.


En este artculo del tutorial crearemos un ejemplo de dilogos modales y no modales. Podemos mostrar un dilogo en pantalla con una de las siguientes dos funciones:
void QWidget::show();

Esta funcin se hereda de QWidget y es equivalente a llamar a la funcin setVisible con un parmetro booleano con valor de true, mostrar un dilogo a travs de esta funcin es til si queremos que el usuario pueda continuar interactuando con la ventana que mostr el dilogo, los dilogos que permiten dicha interaccin se conocen con el nombre de dilogos no modales.
int QDialog::exec();

Esta funcin sirve para mostrar un dilogo modal, este es un tipo de dilogos que bloquean el acceso a las dems ventanas de la aplicacin. Mostrar un dilogo con la funcin exec() permite obtener el valor de la respuesta elegida por el usuario. A continuacin mostramos un ejemplo para observar de mejor manera la diferencia entre show y exec.

El ejemplo se compone de los siguientes archivos: dialogomodal.h dialogomodal.cpp widgetprincipal.h widgetprincipal.cpp main.cpp La clase DialogoModal, representa un dilogo personalizado muy simple que slo muestra una etiqueta en el lugar en dnde se colocaran los widgets en un dilogo de una aplicacin real, est clase nos servir para ver cmo podemos gestionar las respuestas que puede emitir un dilogo modal.

1 de 6

04/12/11 23:45

Dilogos modales y no modales.

http://www.zonaqt.com/book/export/html/294

El cdigo de la clase DialogoModal es el siguiente: NOTA: Slo explicaremos las lneas relevantes para el ejemplo o que no hayan sido explicadas en artculos anteriores de este tutorial.

dialogomodal.h
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. #ifndef DIALOGOMODAL_H #define DIALOGOMODAL_H #include <QDialog> class QLabel; class QPushButton; class DialogoModal : public QDialog { Q_OBJECT public: explicit DialogoModal(QWidget *parent = 0); private: QLabel *nombre; QPushButton *botonAceptar; QPushButton *botonRechazar; QPushButton *botonOtro; private slots: void botoonOtroPresionado(); }; #endif // DIALOGOMODAL_H

dialogomodal.cpp
1. 2. 3. 4. 5. 6. #include "dialogomodal.h" #include #include #include #include <QHBoxLayout> <QLabel> <QPushButton> <QVBoxLayout>

2 de 6

04/12/11 23:45

Dilogos modales y no modales.


7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.

http://www.zonaqt.com/book/export/html/294

DialogoModal::DialogoModal(QWidget *parent) : QDialog(parent) { QVBoxLayout* layoutPrincipal = new QVBoxLayout; QHBoxLayout* layoutBotones = new QHBoxLayout; nombre = new QLabel(trUtf8("Dilogo Modal")); botonAceptar = new QPushButton(trUtf8("Aceptar")); botonRechazar = new QPushButton(trUtf8("Rechazar")); botonOtro = new QPushButton(trUtf8("Otro")); nombre->setFont(QFont("Sans-Serif", 15)); layoutBotones->addStretch(); layoutBotones->addWidget(botonAceptar); layoutBotones->addWidget(botonRechazar); layoutBotones->addWidget(botonOtro); layoutPrincipal->addWidget(nombre); layoutPrincipal->addLayout(layoutBotones); setLayout(layoutPrincipal); connect(botonAceptar, SIGNAL(clicked()), this, SLOT(accept())); connect(botonRechazar, SIGNAL(clicked()), this, SLOT(reject())); connect(botonOtro, SIGNAL(clicked()), this, SLOT(botonOtroPresionado())); } void DialogoModal::botonOtroPresionado() { done(42); }

Explicaremos slo la implementacin de esta clase, es decir, el archivo cpp. De la lnea 14 a la 17 creamos los widgets que componen nuestro dilogo. Los botones botonAceptar, botonRechazar y botonOtro representan las distintas opciones con las que el usuario puede responder al mensaje en el dilogo. De las lneas 31 a 33 conectamos la seal clicked() de los botones al slot correspondiente con la accin que queremos que realicen. Los botones botonAceptar y botonRechazar se conectan a los slots accept() y reject(), los cules estn previamente denidos en QDialog y se encargan de ocultar el dilogo y devolver el cdigo respuesta correspondiente, 1 para accept (aceptar) y 0 para reject (rechazar), como valor de retorno de la funcin exec. Por otra parte el botn de nombre botonOtro se conecta a un slot botonOtroPresionado el cul es implementado por nosotros. Dicha implementacin comienza en la lnea 36 y en realidad es slo una envoltura para llamar al slot:
QDialog::done(int r)

El cual tambin es parte de QDialog, este slot nos permite hacer algo similar a accept() y reject(), es decir, ocultar el dilogo y enviar un cdigo de respuesta, con la diferencia de que en done() podemos especicar el cdigo de respuesta que queremos enviar. En este caso enviamos el nmero 42, pero puede ser cualquier otro entero.

3 de 6

04/12/11 23:45

Dilogos modales y no modales.

http://www.zonaqt.com/book/export/html/294

El cdigo de la clase WidgetPrincipal es el siguiente:

widgetprincipal.h
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. #ifndef WIDGETPRINCIPAL_H #define WIDGETPRINCIPAL_H #include <QWidget> class class class class QDialog; QLabel; QPushButton; DialogoModal;

class WidgetPrincipal : public QWidget { Q_OBJECT public: explicit WidgetPrincipal(QWidget *parent = 0); signals: private: QPushButton *botonDialogoModal; QPushButton *botonDialogoNoModal; QLabel *resultadoDialogoModal; QDialog *dialogoNoModal; DialogoModal *dialogoModal; private slots: void ejecutar(); }; #endif // WIDGETPRINCIPAL_H

widgetprincipal.cpp
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. #include "dialogomodal.h" #include "widgetprincipal.h" #include #include #include #include #include <QHBoxLayout> <QPushButton> <QLabel> <QApplication> <QMessageBox>

WidgetPrincipal::WidgetPrincipal(QWidget *parent) : QWidget(parent) { QGridLayout* layoutPrincipal = new QGridLayout; botonDialogoModal = new QPushButton(QObject::trUtf8("Mostrar Dilogo Modal")); botonDialogoNoModal = new QPushButton(QObject::trUtf8("Mostrar Dilogo No Modal")); resultadoDialogoModal = new QLabel("\t\t"); dialogoModal = new DialogoModal; dialogoNoModal = new QDialog(this); resultadoDialogoModal->setFrameStyle(1); layoutPrincipal->addWidget(botonDialogoModal, 0, 0);

4 de 6

04/12/11 23:45

Dilogos modales y no modales.

http://www.zonaqt.com/book/export/html/294

26. layoutPrincipal->addWidget(resultadoDialogoModal, 0, 1); layoutPrincipal->addWidget(botonDialogoNoModal, 1, 0); 27. 28. setLayout(layoutPrincipal); 29. setWindowFlags(Qt::Window); 30. setWindowTitle(trUtf8("Dilogos Personalizados")); 31. 32. 33. connect(botonDialogoModal, SIGNAL(clicked()), this, SLOT(ejecutar())); 34. connect(botonDialogoNoModal, SIGNAL(clicked()), dialogoNoModal, SLOT(show())); 35. connect(this, SIGNAL(rejected()), this, SLOT(QApplication::exit())); 36. } 37. 38. void WidgetPrincipal::ejecutar() { 39. int respuesta = dialogoModal->exec(); 40. 41. QMessageBox::information(this, "", QString::number(respuesta)); 42. switch(respuesta) { 43. case 0: 44. resultadoDialogoModal->setText(trUtf8("Rechazar presionado")); 45. break; 46. 47. case 1: 48. resultadoDialogoModal->setText(trUtf8("Aceptar presionado")); 49. break; 50. 51. default: 52. resultadoDialogoModal->setText(trUtf8("Otro presionado")); 53. break; 54. 55. } 56. }

Explicaremos slo la implementacin de esta clase, es decir, el archivo cpp. De las lneas 15 a 21 creamos los widgets que componen nuestra widget. En la lnea 18 creamos una etiqueta que mostrar la respuesta de nuestro dilogo modal y le indicamos que muestre dos tabuladores como texto para que tenga un tamao mnimo que pueda contener la respuesta del dilogo, esto es slo por motivos estticos. En la lnea 21 creamos un dilogo que utilizaremos como dilogo no modal e indicamos que nuestra clase WidgetPrincipal ser su padre, esto provocar que el dilogo no modal se muestre centrado respecto a la posicin de nuestro widget; Este comportamiento no lo observamos para nuestro dilogo modal creado en la lnea 20 ya que no hemos establecido un padre para l.

5 de 6

04/12/11 23:45

Dilogos modales y no modales.

http://www.zonaqt.com/book/export/html/294

En la lnea 23 establecemos un estilo de lnea para el borde/marco de la etiqueta que mostrar la respuesta del dilogo modal. De las lneas 33 a 35 realizamos las conexiones de seales y slots. La seal rejected() tambin se emite cundo se usa el botn cerrar de la barra de ttulo de un dilogo. En las lneas 33 y 34 conectamos la seal clicked de los botones a los slots que mostrarn el dilogo correspondiente, modal o no modal, el dilogo no modal lo mostramos llamando directamente a show debido a que esta funcin no devuelve ningn cdigo de respuesta que tengamos que gestionar. En la lnea 35 conectamos la seal, rejected() de nuestra ventana al QApplication::exit(), el cual har que termine nuestra aplicacin. El dilogo modal lo mostramos en el slot ejecutar(), implementado por nosotros a partir de la lnea 38 y asignamos su resultado a una variable, despus procesamos el valor de este resultado, en este caso comparamos dicho valor con los cdigos de resultado usuales y el que denimos nosotros, dependiendo de con que valor coincida modicamos el valor de la etiqueta resultadoDialogoModal.

Es todo en la primera parte de este artculo, en la siguiente parte continuaremos con el tema de los dilogos; Mostraremos la otra forma de obtener informacin de parte del usuario: Utilizando los dilogos estndar de Qt.

6 de 6

04/12/11 23:45

Dialogos Estndar de Qt

http://www.zonaqt.com/book/export/html/295

Dialogos Estndar de Qt
En el artculo anterior revisamos la primera de las dos formas principales de utilizar dilogos en Qt, esto es creando clases que hereden de QDialog, implementando la funcionalidad de estas clases y gestionando las respuestas que recibimos a travs de la funcin QDialog::exec() En este artculo veremos la segunda forma de utilizar dilogos en una aplicacin de Qt, esto es, utilizando las clases de dilogos estndar que nos proporciona Qt, estas clases son: QMessageBox Permite mostrar mensajes de noticacin al usuario. QFileDialog Permite mostrar un dilogo que sirve para seleccionar un archivo o carpeta del sistema de archivos. QInputDialog Permite mostrar un dilogo con un widget para que el usuario puede introducir informacin. QColorDialog Muestra un dilogo para que el usuario pueda seleccionar un color. QPrintDialog Muestra un dilogo para especicar conguraciones de la impresora. Para este artculo utilizaremos la aplicacin de ejemplo "Standard Dialogs" de la documentacin ocial de Qt la cual est disponible en el sitio web de Qt y desde la seccin Help de Qt Creator. Este ejemplo se compone de los siguientes archivos: dialogo.h dialogo.cpp main.cpp Los archivos dialogo.h y ventana.cpp componen la clase Dialogo, la cual representa el widget principal de la aplicacin de ejemplo. Esta clase esta compuesta por dos columnas de widgets, una de ellas est compuesta por botones; Cada uno de ellos servir para mostrar un dilogo estndar que nos permitir obtener un dato del usuario. La segunda columna se compone de etiquetas y en cada una de ellas escribiremos la informacin que proporcion el usuario a travs del dilogo correspondientes. Esta ventana se muestra en la siguiente imagen.

El cdigo de la clase Dilogo es el siguiente:

dialogo.h
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. #ifndef DIALOG_H #define DIALOG_H #include <QDialog> class QCheckBox; class QLabel; class QErrorMessage; class Dialogo : public QDialog { Q_OBJECT public: Dialogo(QWidget *parent = 0); private slots: void setInteger(); void setDouble(); void setItem(); void setText(); void setColor(); void setFont(); void setExistingDirectory(); void setOpenFileName(); void setOpenFileNames(); void setSaveFileName(); void criticalMessage();

1 de 10

04/12/11 23:46

Dialogos Estndar de Qt
29. void informationMessage(); 30. void questionMessage(); 31. void warningMessage(); 32. void errorMessage(); 33. 34. private: 35. QCheckBox *native; 36. QLabel *integerLabel; 37. QLabel *doubleLabel; 38. QLabel *itemLabel; 39. QLabel *textLabel; 40. QLabel *colorLabel; 41. QLabel *fontLabel; 42. QLabel *directoryLabel; 43. QLabel *openFileNameLabel; 44. QLabel *openFileNamesLabel; 45. QLabel *saveFileNameLabel; 46. QLabel *criticalLabel; 47. QLabel *informationLabel; 48. QLabel *questionLabel; 49. QLabel *warningLabel; 50. QLabel *errorLabel; 51. QErrorMessage *errorMessageDialog; 52. 53. QString openFilesPath; 54. };

http://www.zonaqt.com/book/export/html/295

dialogo.cpp
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. #include #include #include #include #include #include #include #include #include <QColorDialog> <QErrorMessage> <QFileDialog> <QFontDialog> <QGridLayout> <QInputDialog> <QLabel> <QMessageBox> <QPushButton>

#include "dialogo.h" #define MESSAGE \ Dialogo::tr("<p>Message boxes "and any number of "<p>Click a button "will activate the

have a caption, a text, " \ buttons, each with standard or custom texts." \ to close the message box. Pressing the Esc button " \ detected escape button (if any).")

Dialogo::Dialogo(QWidget *parent) : QDialog(parent) { errorMessageDialog = new QErrorMessage(this); int frameStyle = QFrame::Sunken | QFrame::Panel; integerLabel = new QLabel; integerLabel->setFrameStyle(frameStyle); QPushButton *integerButton = new QPushButton(tr("QInputDialog::get&Int()")); doubleLabel = new QLabel; doubleLabel->setFrameStyle(frameStyle); QPushButton *doubleButton = new QPushButton(tr("QInputDialog::get&Double()")); itemLabel = new QLabel; itemLabel->setFrameStyle(frameStyle); QPushButton *itemButton = new QPushButton(tr("QInputDialog::getIte&m()")); textLabel = new QLabel; textLabel->setFrameStyle(frameStyle); QPushButton *textButton = new QPushButton(tr("QInputDialog::get&Text()")); colorLabel = new QLabel; colorLabel->setFrameStyle(frameStyle); QPushButton *colorButton = new QPushButton(tr("QColorDialog::get&Color()")); fontLabel = new QLabel; fontLabel->setFrameStyle(frameStyle); QPushButton *fontButton = new QPushButton(tr("QFontDialog::get&Font()")); directoryLabel = new QLabel; directoryLabel->setFrameStyle(frameStyle); QPushButton *directoryButton = new QPushButton(tr("QFileDialog::getE&xistingDirectory()")); openFileNameLabel = new QLabel; openFileNameLabel->setFrameStyle(frameStyle); QPushButton *openFileNameButton = new QPushButton(tr("QFileDialog::get&OpenFileName()")); openFileNamesLabel = new QLabel; openFileNamesLabel->setFrameStyle(frameStyle); QPushButton *openFileNamesButton = new QPushButton(tr("QFileDialog::&getOpenFileNames()")); saveFileNameLabel = new QLabel; saveFileNameLabel->setFrameStyle(frameStyle); QPushButton *saveFileNameButton = new QPushButton(tr("QFileDialog::get&SaveFileName()"));

2 de 10

04/12/11 23:46

Dialogos Estndar de Qt
72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. criticalLabel = new QLabel; criticalLabel->setFrameStyle(frameStyle); QPushButton *criticalButton = new QPushButton(tr("QMessageBox::critica&l()")); informationLabel = new QLabel; informationLabel->setFrameStyle(frameStyle); QPushButton *informationButton = new QPushButton(tr("QMessageBox::i&nformation()")); questionLabel = new QLabel; questionLabel->setFrameStyle(frameStyle); QPushButton *questionButton = new QPushButton(tr("QMessageBox::&question()")); warningLabel = new QLabel; warningLabel->setFrameStyle(frameStyle); QPushButton *warningButton = new QPushButton(tr("QMessageBox::&warning()")); errorLabel = new QLabel; errorLabel->setFrameStyle(frameStyle); QPushButton *errorButton = new QPushButton(tr("QErrorMessage::showM&essage()")); connect(integerButton, SIGNAL(clicked()), this, SLOT(setInteger())); connect(doubleButton, SIGNAL(clicked()), this, SLOT(setDouble())); connect(itemButton, SIGNAL(clicked()), this, SLOT(setItem())); connect(textButton, SIGNAL(clicked()), this, SLOT(setText())); connect(colorButton, SIGNAL(clicked()), this, SLOT(setColor())); connect(fontButton, SIGNAL(clicked()), this, SLOT(setFont())); connect(directoryButton, SIGNAL(clicked()), this, SLOT(setExistingDirectory())); connect(openFileNameButton, SIGNAL(clicked()), this, SLOT(setOpenFileName())); connect(openFileNamesButton, SIGNAL(clicked()), this, SLOT(setOpenFileNames())); connect(saveFileNameButton, SIGNAL(clicked()), this, SLOT(setSaveFileName())); connect(criticalButton, SIGNAL(clicked()), this, SLOT(criticalMessage())); connect(informationButton, SIGNAL(clicked()), this, SLOT(informationMessage())); connect(questionButton, SIGNAL(clicked()), this, SLOT(questionMessage())); connect(warningButton, SIGNAL(clicked()), this, SLOT(warningMessage())); connect(errorButton, SIGNAL(clicked()), this, SLOT(errorMessage())); native = new QCheckBox(this); native->setText("Use native file dialog."); native->setChecked(true); QGridLayout *layout = new QGridLayout; layout->setColumnStretch(1, 1); layout->setColumnMinimumWidth(1, 250); layout->addWidget(integerButton, 0, 0); layout->addWidget(integerLabel, 0, 1); layout->addWidget(doubleButton, 1, 0); layout->addWidget(doubleLabel, 1, 1); layout->addWidget(itemButton, 2, 0); layout->addWidget(itemLabel, 2, 1); layout->addWidget(textButton, 3, 0); layout->addWidget(textLabel, 3, 1); layout->addWidget(colorButton, 4, 0); layout->addWidget(colorLabel, 4, 1); layout->addWidget(fontButton, 5, 0); layout->addWidget(fontLabel, 5, 1); layout->addWidget(directoryButton, 6, 0); layout->addWidget(directoryLabel, 6, 1); layout->addWidget(openFileNameButton, 7, 0); layout->addWidget(openFileNameLabel, 7, 1); layout->addWidget(openFileNamesButton, 8, 0); layout->addWidget(openFileNamesLabel, 8, 1); layout->addWidget(saveFileNameButton, 9, 0); layout->addWidget(saveFileNameLabel, 9, 1); layout->addWidget(criticalButton, 10, 0); layout->addWidget(criticalLabel, 10, 1); layout->addWidget(informationButton, 11, 0); layout->addWidget(informationLabel, 11, 1); layout->addWidget(questionButton, 12, 0); layout->addWidget(questionLabel, 12, 1); layout->addWidget(warningButton, 13, 0); layout->addWidget(warningLabel, 13, 1); layout->addWidget(errorButton, 14, 0); layout->addWidget(errorLabel, 14, 1); layout->addWidget(native, 15, 0); setLayout(layout); setWindowTitle(tr("Standard Dialogs")); } void Dialogo::setInteger() { bool ok; int i = QInputDialog::getInt(this, tr("QInputDialog::getInteger()"), tr("Percentage:"), 25, 0, 100, 1, &ok); if (ok) integerLabel->setText(tr("%1%").arg(i)); } void Dialogo::setDouble() { bool ok; double d = QInputDialog::getDouble(this, tr("QInputDialog::getDouble()"),

http://www.zonaqt.com/book/export/html/295

3 de 10

04/12/11 23:46

Dialogos Estndar de Qt
172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. tr("Amount:"), 37.56, -10000, 10000, 2, &ok); if (ok) doubleLabel->setText(QString("$%1").arg(d)); } void Dialogo::setItem() { QStringList items; items << tr("Spring") << tr("Summer") << tr("Fall") << tr("Winter"); bool ok; QString item = QInputDialog::getItem(this, tr("QInputDialog::getItem()"), tr("Season:"), items, 0, false, &ok); if (ok && !item.isEmpty()) itemLabel->setText(item); } void Dialogo::setText() { bool ok; QString text = QInputDialog::getText(this, tr("QInputDialog::getText()"), tr("User name:"), QLineEdit::Normal, QDir::home().dirName(), &ok); if (ok && !text.isEmpty()) textLabel->setText(text); }

http://www.zonaqt.com/book/export/html/295

void Dialogo::setColor() { QColor color; if (native->isChecked()) color = QColorDialog::getColor(Qt::green, this); else color = QColorDialog::getColor(Qt::green, this, "Select Color", QColorDialog::DontUseNativeDialog); if (color.isValid()) { colorLabel->setText(color.name()); colorLabel->setPalette(QPalette(color)); colorLabel->setAutoFillBackground(true); } } void Dialogo::setFont() { bool ok; QFont font = QFontDialog::getFont(&ok, QFont(fontLabel->text()), this); if (ok) { fontLabel->setText(font.key()); fontLabel->setFont(font); } } void Dialogo::setExistingDirectory() { QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly; if (!native->isChecked()) options |= QFileDialog::DontUseNativeDialog; QString directory = QFileDialog::getExistingDirectory(this, tr("QFileDialog::getExistingDirectory()"), directoryLabel->text(), options); if (!directory.isEmpty()) directoryLabel->setText(directory); } void Dialogo::setOpenFileName() { QFileDialog::Options options; if (!native->isChecked()) options |= QFileDialog::DontUseNativeDialog; QString selectedFilter; QString fileName = QFileDialog::getOpenFileName(this, tr("QFileDialog::getOpenFileName()"), openFileNameLabel->text(), tr("All Files (*);;Text Files (*.txt)"), &selectedFilter, options); if (!fileName.isEmpty()) openFileNameLabel->setText(fileName); } void Dialogo::setOpenFileNames() { QFileDialog::Options options; if (!native->isChecked()) options |= QFileDialog::DontUseNativeDialog; QString selectedFilter; QStringList files = QFileDialog::getOpenFileNames( this, tr("QFileDialog::getOpenFileNames()"), openFilesPath, tr("All Files (*);;Text Files (*.txt)"), &selectedFilter, options); if (files.count()) { openFilesPath = files[0]; openFileNamesLabel->setText(QString("[%1]").arg(files.join(", "))); } } void Dialogo::setSaveFileName()

4 de 10

04/12/11 23:46

Dialogos Estndar de Qt
272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. { QFileDialog::Options options; if (!native->isChecked()) options |= QFileDialog::DontUseNativeDialog; QString selectedFilter; QString fileName = QFileDialog::getSaveFileName(this, tr("QFileDialog::getSaveFileName()"), saveFileNameLabel->text(), tr("All Files (*);;Text Files (*.txt)"), &selectedFilter, options); if (!fileName.isEmpty()) saveFileNameLabel->setText(fileName); } void Dialogo::criticalMessage() { QMessageBox::StandardButton reply; reply = QMessageBox::critical(this, tr("QMessageBox::critical()"), MESSAGE, QMessageBox::Abort | QMessageBox::Retry | QMessageBox::Ignore); if (reply == QMessageBox::Abort) criticalLabel->setText(tr("Abort")); else if (reply == QMessageBox::Retry) criticalLabel->setText(tr("Retry")); else criticalLabel->setText(tr("Ignore")); } void Dialogo::informationMessage() { QMessageBox::StandardButton reply; reply = QMessageBox::information(this, tr("QMessageBox::information()"), MESSAGE); if (reply == QMessageBox::Ok) informationLabel->setText(tr("OK")); else informationLabel->setText(tr("Escape")); } void Dialogo::questionMessage() { QMessageBox::StandardButton reply; reply = QMessageBox::question(this, tr("QMessageBox::question()"), MESSAGE, QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); if (reply == QMessageBox::Yes) questionLabel->setText(tr("Yes")); else if (reply == QMessageBox::No) questionLabel->setText(tr("No")); else questionLabel->setText(tr("Cancel")); } void Dialogo::warningMessage() { QMessageBox msgBox(QMessageBox::Warning, tr("QMessageBox::warning()"), MESSAGE, 0, this); msgBox.addButton(tr("Save &Again"), QMessageBox::AcceptRole); msgBox.addButton(tr("&Continue"), QMessageBox::RejectRole); if (msgBox.exec() == QMessageBox::AcceptRole) warningLabel->setText(tr("Save Again")); else warningLabel->setText(tr("Continue")); } void Dialogo::errorMessage() { errorMessageDialog->showMessage( tr("This dialog shows and remembers error messages. " "If the checkbox is checked (as it is by default), " "the shown message will be shown again, " "but if the user unchecks the box the message " "will not appear again if QErrorMessage::showMessage() " "is called with the same message.")); errorLabel->setText(tr("If the box is unchecked, the message " "won't appear again.")); }

http://www.zonaqt.com/book/export/html/295

A continuacin explicaremos el cdigo de la implementacin de nuestra clase Dialogo, es decir, el archivo cpp. El cdigo es largo, pero muchas cosas se repiten, as que la explicacin se acorta bastante. De las lneas 1 a 12 incluimos los archivos de cabecera que necesitamos para este ejemplo. En la lnea 20 comienza el constructor de nuestra clase. En la lnea 23 creamos un objeto de la clase QErrorMessage el cual provee un dilogo para mostrar un mensaje de error. En la lnea 25 obtenemos el valor de la opcin que indica el estilo que queremos dar a la etiqueta. De la lnea 27 a la 95 creamos los botones y las etiquetas que contendr el dilogo y establecemos el texto y opciones para cada uno de estos widgets. De la lnea 97 a la lnea 116 realizamos las conexiones de cada uno de los botones con su slot correspondiente. En seguida explicaremos el cdigo de cada uno de estos slots. De la lnea 121 a la 155 creamos el layout principal de nuestro widget y organizamos los widgets de acuerdo a l. El la lnea 160 comienza la implementacin de los slots de nuestro dilogo, en todos ellos realizamos las siguiente acciones: Creamos una variable para almacenar la informacin que ingresa el usuario por medio del dilogo.

5 de 10

04/12/11 23:46

Dialogos Estndar de Qt

http://www.zonaqt.com/book/export/html/295

Ejecutamos el dilogo para obtener la informacin del usuario y el valor de respuesta, este ltimo est determinado por el botn que presiona el usuario. Evaluamos el valor de respuesta del dilogo. Dependiendo del valor de la respuesta decidimos de que manera procesar la informacin capturada, si es que la hay. Si el usuario no cierra el dilogo y en cambio presiona algn botn, entonces escribimos el valor de la respuesta en la etiqueta correspondiente. Comenzaremos con los slots que hacen uso de los dilogos que nos ofrece la clase QInputDialog. De la lnea 160 a la 167 implementamos el slot setInteger, en l mostramos un dilogo que contiene una spinBox que permitir al usuario establecer un valor numrico entero. Este dilogo lo ejecutamos mediante la funcin
int QInputDialog::getInt ( QWidget * parent, const QString & title, const QString & label, int value = 0, int min = -2147483647, int max = 2147483647, int step = 1, bool

Los primeros tres y los dos ltimos parmetros de est familia de funciones y de algunos de los otros dilogos estndar son iguales, indican el widget padre, el ttulo del dilogo, el texto que se mostrar en el dilogo, un apuntador a la variable donde se almacenar la respuesta al dilogo y una lista de ags u opciones del dilogo. A partir del cuarto parmetro y .en orden, los parmetros especcos de este dilogo son: El valor predeterminado que al que se establecer la spinbox cuando se muestre el dilogo. El valor mnimo al que se puede establecer el valor de la spinbox. El valor mximo al que se puede establecer el valor de la spinbox. La cantidad en que se incrementar o decrementar el valor de la spinbox al presionar las echas del extremo (step o paso). De las lneas 169 a 176 implementamos el slot setDouble, en l mostramos un dilogo muy similar al que del slot obtenerEntero con la diferencia de que el valor de la spinbox podr ser un valor decimal o de punto otante de doble precisin. Este dilogo lo ejecutamos mediante la funcin
double QInputDialog::getDouble ( QWidget * parent, const QString & title, const QString & label, double value = 0, double min = -2147483647, double max = 2147483647,

Los parmetros de esta funcin son muy similares a la funcin getInt salvo por el sptimo parmetro, el cul indica el nmero de decimales del nmero, el valor por defecto es de uno. De la lnea 178 a 188 implementamos el slot obtenerElemento, en l mostramos un dilogo que contiene una combobox que permite al usuario elegir un valor de una lista que indiquemos. Este dilogo lo ejecutamos mediante la funcin
QString QInputDialog::getItem ( QWidget * parent, const QString & title, const QString & label, const QStringList & items, int current = 0, bool editable = true, bool

Esta funcin recibe del cuarto al sexto parmetro: Una lista de cadenas de texto que sern los elementos de la combobox. La posicin del elemento seleccionado por defecto, si no se especica ser cero. Un valor booleano que indica si la combobox ser editable. De las lneas 190 a 198 implementamos el slot setText, en l mostramos un dilogo que nos permitir obtener un valor de texto capturado por el usuario. Este dilogo lo ejecutamos mediante la funcin
QString QInputDialog::getText ( QWidget * parent, const QString & title, const QString & label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString

Est funcin recibe como cuarto y quinto parmetro: El modo (EchoMode) en el que se mostrar el texto ingresado. Aqui podemos establecer un valor de la enumeracin EchoMode el cual indicar si el texto debe ser visible, que no se muestre o que se muestren caracteres para enmascarar contraseas (como asteriscos) El valor predeterminado que se mostrar en el campo de texto De las lneas 200 a 213 implementamos el slot setColor, en l mostramos un dilogo que contiene controles especializados para

6 de 10

04/12/11 23:46

Dialogos Estndar de Qt

http://www.zonaqt.com/book/export/html/295

permitir que el usuario eliga un color. Este dilogo lo mostramos mediante la funcin
QColorDialog::getColor( const QColor & initial, QWidget * parent, const QString & title, ColorDialogOptions options = 0 )

Esta funcin recibe como parmetros: Un objeto de la clase QColor que indica el color inicial que se establecer en el dilogo, si no se especica ninguno el color blanco ser el seleccionado El widget padre del dilogo El ttulo del dilogo Miembros de la enumeracin ColorDialogOptions, que permiten establecer algunas propiedades del dilogo como mostrar canal alfa o usar el dilogo nativo del sistema operativo De la lnea 215 a 223 implementamos el slot setFont, el cual muestra un dilogo que incluye controles especiales para que el usuario pueda seleccionar una fuente para el texto. Dicho dilogo se muestra mediante la funcin
QFont QFontDialog::getFont(bool *ok, QWidget *parent)

Dicha funcin tiene mltiples sobrecargas en las cuales se pueden establecer valores iniciales y conguraciones del dilogo similares a las de los dilogos anteriores pero en este ejemplo utilizamos una funcin que slo recibe como parmetros el apuntador a la variable que almacena la respuesta que da el usuario al dilogo y un apuntador al widget padre de este dilogo. De las lneas 225 a 286 implementamos los slots que hacen uso de las funciones estticas de la clase QFileDialog. De la lnea 225 a 236 implementamos el slot setExistentDirectory en el cual ejecutamos un dilogo que mostrar una ventana de exploracin del sistema de archivos y que nos permitir seleccionar una carpeta o directorio. Este dilogo lo mostramos con la funcin
QString getExistingDirectory ( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), Options options = ShowDirsOnly )

7 de 10

04/12/11 23:46

Dialogos Estndar de Qt

http://www.zonaqt.com/book/export/html/295

Esta funcin recibe como parmetros: Un apuntador al widget padre del dilogo. El ttulo del dilogo. La ruta del directorio en dnde se desea comenzar a buscar. Miembros de la enumeracin QFileDialog::Options que permiten congurar opciones del dilogo como el slo mostrar directorios o utilizar un dilogo no nativo. De la lnea 238 a 252 implementamos el slot setOpenFileName el cual funciona de manera muy similar al slot anterior con la diferencia de que este permite seleccionar un archivo en lugar de un directorio. Mostramos el dilogo utilizado en este slot con la funcin
QString QFileDialog::getOpenFileName ( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter =

En esta funcin el ltimo y los tres primeros parmetros son iguales al de la funcin del slot anterior. Los parmetros propios de esta funcin son: Como cuarto parmetro, una cadena que representa los ltros que podrn ser aplicados al dilogo, este ltro determina que tipo de archivo se muestra. Para cada tipo de archivo se escribe una descripcin y entre parntesis la extensin del tipo de archivo. Separamos cada tipo de archivo mediante dos caracteres punto y coma (;). Como quinto parmetro, una cadena que indique el ltro seleccionado actualmente. De la lnea 254 a la 270 implementamos el slot setOpenFileNames el cual muestra un dilogo casi igual al del slot anterior con la diferencia de que este permite al usuario seleccionar ms de un archivo. Mostramos el dilogo utilizado en este slot con la funcin
QStringList QFileDialog::getOpenFileNames ( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString &

8 de 10

04/12/11 23:46

Dialogos Estndar de Qt

http://www.zonaqt.com/book/export/html/295

Los parmetros de la funcin utilizada para ejecutar el dilogo son iguales a los de la funcin utilizada para abrir un solo archivo. De la lnea 272 a 286 implementamos el slot setSaveFileName el cual muestra un dilogo que permite guardar un archivo al usuario y eligiendo su ubicacin y especicando su nombre. El dilogo utilizado en este slot lo ejecutamos mediante la funcin
QString QFileDialog::getSaveFileName ( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter =

Los parmetros de esta funcin son iguales que los de la funcin utilizada para ejecutar el dilogo que permite abrir archivos. Si especicamos un nombre que coincida con el de un archivo existente se mostrar otro dilogo solicitando la conrmacin del usuario, este dilogo muestra dos botones de respuesta: Aceptar y Cancelar. A partir de la lnea 288 y hasta el n del archivo implementamos los slots que muestran los dilogos de la case QMessageBox. Entre las lneas 288 y 300 implementamos el slot criticalMessage el cual permite mostrar un dilogo con un icono de error que normalmente sirve para indicar que ocurri algn error grave en la aplicacin. Mostramos este dilogo mediante la funcin
StandardButton QMessageBox::critical ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton

Dicha funcin nos devuelve un valor de la enumeracin StandarButttons, la cual contiene todos los posibles valores que devuelve un dilogo al presionar cada uno de los botones disponibles, como: Aceptar, Cancelar, Reintentar, S, S a todo, No, Cancelar. Las cuatro funciones de la clase QMessageBox que revisaremos y que nos sirven para mostrar un dilogo de informacin reciben los mismos parmetros, los cuales son: Un apuntador al widget padre del dilogo. El ttulo del dilogo.

9 de 10

04/12/11 23:46

Dialogos Estndar de Qt

http://www.zonaqt.com/book/export/html/295

El texto que deseamos mostrar en el dilogo. Una lista de valores de la enumeracin StandarButton separadados por caracteres 2de barra, (el que se usa para un OR a nivel bit en C/C++) en donde cada valor indica que se debe mostrar su botn correspondiente. Un valor de la enumeracin StandarButtons el cual indica que botn se establecer como predeterminado, es decir sobre cual se har un efectro de clic al presionar la tecla enter al estar el dilgo activo. Entre las lneas 302 y 310 implementamos el slot informationMessage en el cual mostramos un dilogo que sirve para mostrar informacin al usuario, como un aviso sobre la conclusin de una tarea o una noticacin de algn evento. Mostramos el dilogo utilizado mediante la funcin
StandardButton QMessageBox::information ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton

De la lnea 312 a 324 implementamos el slot questionMessage en el cual mostramos un dilogo con icono de un signo de interrogacin, este dilogo sirve para realizar una pregunta al usuario o solicitar su conrmacin u aprobacin para un proceso, como al guardar o borrar un archivo. Mostramos este dilogo mediante la funcin
StandardButton QMessageBox::question ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton

De la la lnea 326 a la 337 implementamos el slot warningMessage en el cual mostramos un dilogo con que sirve para mostrar un mensaje de advertencia, como informacin sobre un error poco grave. Este dilogo lo mostramos mediante la funcin
StandardButton QMessageBox::warning ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton

De la lnea 339 a la 350 implementamos el slot errorMessage en el cual mostramos un dilogo que contiene un mensaje de error. Este dilogo lo mostramos mediante la funcin
void QErrorMessage::showMessage( const QString & message )

Esta funcin recibe como parmetro una cadena de texto con el mensaje de error que se desea mostrar al usuario. En el archivo main.cpp simplemente creamos un objeto de esta clase y lo mostramos en pantalla.

10 de 10

04/12/11 23:46

Você também pode gostar