Blame platform-demos/es/image-viewer.cpp.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" id="image-viewer.cpp" xml:lang="es">
Packit 1470ea
Packit 1470ea
  <info>
Packit 1470ea
    <link type="guide" xref="cpp#examples"/>
Packit 1470ea
Packit 1470ea
    <desc>Algo más que una sencilla aplicación «Hola mundo» en GTKmm.</desc>
Packit 1470ea
Packit 1470ea
    <revision pkgversion="0.1" version="0.1" date="2011-03-18" status="review"/>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Proyecto de documentación de GNOME</name>
Packit 1470ea
      <email its:translate="no">gnome-doc-list@gnome.org</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Johannes Schmid</name>
Packit 1470ea
      <email its:translate="no">jhs@gnome.org</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="editor">
Packit 1470ea
      <name>Marta Maria Casetti</name>
Packit 1470ea
      <email its:translate="no">mmcasetti@gmail.com</email>
Packit 1470ea
      <years>2013</years>
Packit 1470ea
    </credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Daniel Mustieles</mal:name>
Packit 1470ea
      <mal:email>daniel.mustieles@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011 - 2017</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Nicolás Satragno</mal:name>
Packit 1470ea
      <mal:email>nsatragno@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2012 - 2013</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Jorge González</mal:name>
Packit 1470ea
      <mal:email>jorgegonz@svn.gnome.org</mal:email>
Packit 1470ea
      <mal:years>2011</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
<title>Visor de imágenes</title>
Packit 1470ea
Packit 1470ea
<synopsis>
Packit 1470ea
  

En este tutorial aprenderá:

Packit 1470ea
  <list>
Packit 1470ea
    <item>

Algunos conceptos básicos de programación en C++/GObject

</item>
Packit 1470ea
    <item>

Cómo escribir una aplicación GTK en C++

</item>
Packit 1470ea
  </list>
Packit 1470ea
</synopsis>
Packit 1470ea
Packit 1470ea
<media type="image" mime="image/png" src="media/image-viewer.png"/>
Packit 1470ea
Packit 1470ea
<section id="anjuta">
Packit 1470ea
  <title>Crear un proyecto en Anjuta</title>
Packit 1470ea
  

Antes de empezar a programar, deberá configurar un proyecto nuevo en Anjuta. Esto creará todos los archivos que necesite para construir y ejecutar el código más adelante. También es útil para mantener todo ordenado.

Packit 1470ea
  <steps>
Packit 1470ea
    <item>
Packit 1470ea
    

Inicie Anjuta y pulse <guiseq><gui>Archivo</gui><gui>Nuevo</gui><gui>Proyecto</gui></guiseq> para abrir el asistente de proyectos.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Elija <gui>GTKmm (simple)</gui> de la pestaña <gui>C++</gui>, pulse <gui>Adelante</gui> y rellene los detalles en las siguientes páginas. Use <file>visor-imagenes</file> como nombre de proyecto y de carpeta.

Packit 1470ea
   	</item>
Packit 1470ea
    <item>
Packit 1470ea
    

Asegúrese de que <gui>Usar GtkBuilder para la interfaz del usuario</gui> está desactivado, ya que, en este tutorial, la IU se creará manualmente. Revise el tutorial del <link xref="guitar-tuner.cpp">afinador de guitarra</link> si quiere aprender a usar el constructor de interfaces.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Pulse <gui>Aplicar</gui> y se creará el proyecto. Abra <file>src/main.cc</file> desde las pestañas <gui>Proyecto</gui> o <gui>Archivo</gui>. Debería ver algo de código que comience con las líneas:

Packit 1470ea
    
Packit 1470ea
#include <gtkmm.h>
Packit 1470ea
#include <iostream>
Packit 1470ea
Packit 1470ea
#include "config.h">
Packit 1470ea
    </item>
Packit 1470ea
  </steps>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="build">
Packit 1470ea
  <title>Construir el código por primera vez</title>
Packit 1470ea
  

Esto es una configuración de código C++ usando GTKmm. Se ofrecen más detalles a continuación; omita esta lista si entiende los conceptos básicos:

Packit 1470ea
  <list>
Packit 1470ea
  <item>
Packit 1470ea
    

Las tres líneas #include en la parte superior incluyen las bibliotecas config (definiciones útiles para construcción con autoconf), gtkmm (interfaz de usuario) iostream (C++-STL). Las funciones de estas bibliotecas se usan en el resto del código.

Packit 1470ea
   </item>
Packit 1470ea
   <item>
Packit 1470ea
    

La función main crea una ventana (vacía) nueva y establece el título de la ventana.

Packit 1470ea
   </item>
Packit 1470ea
   <item>
Packit 1470ea
    

La llamada kit::run() inicia el bucle principal de GTKmm, que ejecuta la interfaz de usuario y empieza a escuchar eventos (como pulsaciones del ratón y del teclado). Como se ha pasado la ventana como argumento a esta función, la aplicación se cerrará automáticamente cuando se cierre la ventana.

Packit 1470ea
   </item>
Packit 1470ea
  </list>
Packit 1470ea
Packit 1470ea
  

Este código está listo para usarse, por lo que puede compilarlo pulsando <guiseq><gui>Construir</gui><gui>Construir proyecto</gui></guiseq> (o pulsando <keyseq><key>Mayús</key><key>F7</key></keyseq>).

Packit 1470ea
  

Pulse <gui>Ejecutar</gui> en la siguiente ventana que aparece para configurar una construcción de depuración. Esto sólo necesita hacer una vez para la primera construcción.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="ui">
Packit 1470ea
<title>Crear la interfaz de usuario</title>
Packit 1470ea

Ahora se dará vida a la ventana vacía. GTKmm organiza la interfaz de usuario con varios Gtk::Container que pueden contener otros widgets e incluso otros contenedores. Aquí se usará el contenedor más sencillo disponible, una Gtk::Box:

Packit 1470ea
Packit 1470ea
int
Packit 1470ea
main (int argc, char *argv[])
Packit 1470ea
{
Packit 1470ea
	Gtk::Main kit(argc, argv);
Packit 1470ea
Packit 1470ea
	Gtk::Window main_win;
Packit 1470ea
	main_win.set_title ("image-viewer-cpp");
Packit 1470ea
Packit 1470ea
	Gtk::Box* box = Gtk::manage(new Gtk::Box());
Packit 1470ea
	box->set_orientation (Gtk::ORIENTATION_VERTICAL);
Packit 1470ea
	box->set_spacing(6);
Packit 1470ea
	main_win.add(*box);
Packit 1470ea
Packit 1470ea
	image = Gtk::manage(new Gtk::Image());
Packit 1470ea
	box->pack_start (*image, true, true);
Packit 1470ea
Packit 1470ea
	Gtk::Button* button = Gtk::manage(new Gtk::Button("Open Image…"));
Packit 1470ea
	button->signal_clicked().connect (
Packit 1470ea
		sigc::ptr_fun(&on_open_image));
Packit 1470ea
	box->pack_start (*button, false, false);
Packit 1470ea
Packit 1470ea
	main_win.show_all_children();
Packit 1470ea
	kit.run(main_win);
Packit 1470ea
Packit 1470ea
	return 0;
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
  <steps>
Packit 1470ea
    <item>
Packit 1470ea
    

La primera línea crea los widgets que se quieren usar: un botón para abrir una imagen, el widget del visor de imágenes en sí y la caja que se usará como contenedor.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Las llamadas a pack_start añaden los dos widgets a la caja y definen su comportamiento. La imagen se expandirá en cualquier espacio disponible, mientras que el botón será tan grande como se necesite. Se dará cuenta de que no se establecen tamaños explícitos de los widgets. Generalmente, en GTKmm no se necesita ya que hace que sea mucho más sencillo tener una distribución que se ve bien con diferentes tamaños de la ventana. A continuación, se añade la caja a la ventana.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Se debe definir qué sucede cuando el usuario pulsa el botón. GTKmm usa el concepto de señales. Cuando se pulsa el botón, emite la señal clicked, que se puede conectar a alguna acción. Esto se ha hecho usando el método signal_clicked().connect, que indica a GTKmm que llame a la función on_open_image cuando se pulsa el botón y que pase la imagen como un argumento adicional a la función. El retorno de la llamada se definirá en la siguiente sección.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

El último paso es mostrar todos los widgets en la ventana usando show_all_children(). Esto es equivalente a usar el método show() en cada uno de los widgets.

Packit 1470ea
    </item>
Packit 1470ea
  </steps>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="show">
Packit 1470ea
<title>Mostrar la imagen</title>
Packit 1470ea

Ahora se definirá el manejador de la señal clicked para el botón mencionado anteriormente. Añada este código antes del método main.

Packit 1470ea
Packit 1470ea
Gtk::Image* image = 0;
Packit 1470ea
Packit 1470ea
static void
Packit 1470ea
on_open_image ()
Packit 1470ea
{
Packit 1470ea
	Gtk::FileChooserDialog dialog("Open image",
Packit 1470ea
	                              Gtk::FILE_CHOOSER_ACTION_OPEN);
Packit 1470ea
	dialog.add_button (Gtk::Stock::OPEN,
Packit 1470ea
	                   Gtk::RESPONSE_ACCEPT);
Packit 1470ea
	dialog.add_button (Gtk::Stock::CANCEL,
Packit 1470ea
	                   Gtk::RESPONSE_CANCEL);
Packit 1470ea
Packit 1470ea
	Glib::RefPtr<Gtk::FileFilter> filter =
Packit 1470ea
		Gtk::FileFilter::create();
Packit 1470ea
	filter->add_pixbuf_formats();
Packit 1470ea
	filter->set_name("Images");
Packit 1470ea
	dialog.add_filter (filter);
Packit 1470ea
Packit 1470ea
	const int response = dialog.run();
Packit 1470ea
	dialog.hide();
Packit 1470ea
Packit 1470ea
	switch (response)
Packit 1470ea
	{
Packit 1470ea
		case Gtk::RESPONSE_ACCEPT:
Packit 1470ea
			image->set(dialog.get_filename());
Packit 1470ea
			break;
Packit 1470ea
		default:
Packit 1470ea
			break;
Packit 1470ea
	}
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
  

Esto es un poco más complicado que todo lo que se ha intentado hasta ahora, así que se puede desglosar:

Packit 1470ea
  <list>
Packit 1470ea
      <item>
Packit 1470ea
      

El diálogo para elegir el archivo se crea usando el constructor de Gtk::FileChooserDialog. La función toma el título y el tipo del diálogo. En este caso, es un diálogo de tipo Open.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Las siguientes dos líneas añaden un botón Abrir y Cerrar en el diálogo.

Packit 1470ea
    

Note que se está usando nombres de botones del almacén de GTK, en lugar de escribir manualmente «Cancelar» o «Abrir». La ventaja de usar nombres del almacén es que las etiquetas de los botones ya estarán traducidas en el idioma del usuario.

Packit 1470ea
    

El segundo argumento del método add_button() es un valor para identificar el botón pulsado. Aquí también se usan valores predefinidos proporcionados por GTKmm.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Las dos líneas siguientes restringen el diálogo <gui>Abrir</gui> para que sólo muestre archivos que se puedan abrir con Gtk::Image. Primero se crea un objeto de filtro; luego se añaden los tipos de archivos soportados por el Gdk::Pixbuf (que incluye la mayoría de los formatos de imagen como PNG y JPEG) al filtro. Por último, se establece que este filtro sea el filtro del diálogo <gui>Abrir</gui>.

Packit 1470ea
    

Glib::RefPtr es un puntero inteligente usado aquí que se asegura de que el filtro se destruye cuando ya no se hace ninguna referencia a él.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

dialog.run muestra el diálogo <gui>Abrir</gui>. El diálogo esperará a que el usuario seleccione una imagen; cuando lo haga, dialog.run devolverá el valor Gtk::RESPONSE_ACCEPT (devolvería Gtk::RESPONSE_CANCEL si el usuario pulsara <gui>Cancel</gui>). La sentencia switch comprueba esto.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Se oculta el diálogo <gui>Abrir</gui> porque ya no se necesita más. El diálogo se ocultará de todos modos, ya que sólo es una variable local, y se destruye (y por lo tanto se oculta) cuando el ámbito termina.

Packit 1470ea
    </item>
Packit 1470ea
    <item>

Asumiendo que el usuario pulsó <gui>Abrir</gui>, la siguiente línea carga el archivo en la Gtk::Image, por lo que se muestra.

Packit 1470ea
    </item>
Packit 1470ea
  </list>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="build2">
Packit 1470ea
  <title>Construir y ejecutar la aplicación</title>
Packit 1470ea
  

Todo el código debería estar listo para ejecutarse. Pulse <guiseq><gui>Construir</gui><gui>Construir proyecto</gui></guiseq> para construir todo otra vez y pulse <guiseq><gui>Ejecutar</gui><gui>Ejecutar</gui></guiseq> para iniciar la aplicación.

Packit 1470ea
  

Si todavía no lo ha hecho, elija la aplicación <file>Debug/src/visor-imagenes</file> en el diálogo que aparece. Finalmente, pulse <gui>Ejecutar</gui> y disfrute.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="impl">
Packit 1470ea
 <title>Implementación de referencia</title>
Packit 1470ea
 

Si tiene problemas con este tutorial, compare su código con este <link href="image-viewer/image-viewer.cc">código de referencia</link>.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="next">
Packit 1470ea
  <title>Siguientes pasos</title>
Packit 1470ea
  

Aquí hay algunas ideas sobre cómo puede extender esta sencilla demostración:

Packit 1470ea
  <list>
Packit 1470ea
   <item>
Packit 1470ea
   

Haga que el usuario selecciona una carpeta en vez de un archivo, y proporcione controles para moverse por todas las imágenes de una carpeta.

Packit 1470ea
   </item>
Packit 1470ea
   <item>
Packit 1470ea
   

Aplicar filtros aleatorios y efectos a la imagen cuando se carga y permitir al usuario guardar la imagen modificada.

Packit 1470ea
   

<link href="http://www.gegl.org/api.html">GEGL</link> proporciona la capacidad de manipular imágenes de manera potente.

Packit 1470ea
   </item>
Packit 1470ea
   <item>
Packit 1470ea
   

Permitir al usuario cargar imágenes desde recursos de red compartidos, escáneres y otras fuentes más complicadas.

Packit 1470ea
   

Puede usar <link href="http://library.gnome.org/devel/gio/unstable/">GIO</link> para gestionar transferencias de archivos de red y similares, y <link href="http://library.gnome.org/devel/gnome-scan/unstable/">GNOME Scan</link> para gestionar el escaneado.

Packit 1470ea
   </item>
Packit 1470ea
  </list>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
Packit 1470ea
</page>