<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-7521778425930365629</atom:id><lastBuildDate>Sat, 28 Sep 2024 02:14:19 +0000</lastBuildDate><category>qt</category><category>programación</category><category>c++</category><category>infobasic</category><category>client</category><category>svn</category><category>udp</category><category>QString</category><category>echo</category><category>qlearnphrases</category><category>tips qt</category><category>Apuntes</category><category>BuscaminasS</category><category>Hello world</category><category>QActions</category><category>QDesktopServices</category><category>QTableWidget</category><category>QTableWidgetSelectionRange</category><category>QToolBar</category><category>android</category><category>c</category><category>const char</category><category>diff</category><category>divertimentosinformaticos</category><category>git</category><category>google code</category><category>inkscape</category><category>ip</category><category>java</category><category>juegos</category><category>patch</category><category>patrones de diseño</category><category>qDebug</category><category>qlabel</category><category>qtjambi</category><category>redes probabilisticas</category><category>server</category><category>tips</category><title>jferconde</title><description>Blog sobre programación, c++, qt y android</description><link>http://jferconde.blogspot.com/</link><managingEditor>noreply@blogger.com (Anonymous)</managingEditor><generator>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-6689294297014890767</guid><pubDate>Sun, 04 Aug 2013 17:47:00 +0000</pubDate><atom:updated>2013-08-04T19:47:29.072+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">android</category><category domain="http://www.blogger.com/atom/ns#">BuscaminasS</category><category domain="http://www.blogger.com/atom/ns#">inkscape</category><category domain="http://www.blogger.com/atom/ns#">juegos</category><title>inkscape</title><description>Tengo en mente realizar un juego más decente que el simple &lt;a href=&quot;http://jferconde.blogspot.com.es/p/minesweepers.html&quot;&gt;BuscaminasS&lt;/a&gt; y para ello me estoy encontrando con una gran barrera, los gráficos. Es por ello que he empezado a ver las diferentes posibilidades en cuanto al diseño de imágenes. Por ahora estoy probando con &lt;a href=&quot;http://inkscape.org/&quot;&gt;inkscape&lt;/a&gt;&amp;nbsp;y parece bastante prometedor. En concreto estoy siguiendo los siguientes videotutoriales:&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.youtube.com/watch?v=fXslKkuNEho&quot;&gt;http://www.youtube.com/watch?v=fXslKkuNEho&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.youtube.com/watch?v=0gJorjxLj2I&quot;&gt;http://www.youtube.com/watch?v=0gJorjxLj2I&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
El resultado, parece bastante decente sobre todo teniendo en cuenta que no se dibujar.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5DhYkPOJYWBwa3tYogChtV9usS3h2QsOi4nZUxiVysz77mL6EV5AO4wctC7FN09CbWSzz5CQQZz5-ozpK4yN1jaWerRUD5dgbO2XsKuK8hQke65LbyWb8cdvhmZCxaWE5mrdO14lmiKkg/s1600/paisaje_zoom.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5DhYkPOJYWBwa3tYogChtV9usS3h2QsOi4nZUxiVysz77mL6EV5AO4wctC7FN09CbWSzz5CQQZz5-ozpK4yN1jaWerRUD5dgbO2XsKuK8hQke65LbyWb8cdvhmZCxaWE5mrdO14lmiKkg/s320/paisaje_zoom.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://jferconde.blogspot.com/2013/08/inkscape.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5DhYkPOJYWBwa3tYogChtV9usS3h2QsOi4nZUxiVysz77mL6EV5AO4wctC7FN09CbWSzz5CQQZz5-ozpK4yN1jaWerRUD5dgbO2XsKuK8hQke65LbyWb8cdvhmZCxaWE5mrdO14lmiKkg/s72-c/paisaje_zoom.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-1087261230686919913</guid><pubDate>Mon, 31 Oct 2011 17:20:00 +0000</pubDate><atom:updated>2011-10-31T18:20:32.116+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Apuntes</category><title>Apuntes OpenMP</title><description>#pragma omp              directive-name                   [clause, ...]               newline&lt;br /&gt;
&lt;br /&gt;
#pragma omp parallel default(shared) private(beta,pi) &lt;br /&gt;
&lt;br /&gt;
Directivas:&lt;br /&gt;
 parallel.- Una región parallel es un bloque de código que será ejecutado por multiples threads.&lt;br /&gt;
  pasada la región parallel sólo continua el hilo principal en ejecución. Si algún thread&lt;br /&gt;
  finaliza dentro de una región parallel todos los threads finalizan y su resultado no está&lt;br /&gt;
  definido.&lt;br /&gt;
 Work-Sharing Constructs:&lt;br /&gt;
  DO / for Directive.- Las iteraciones del bucle serán ejecutadas en paralelo por todos los threads.&lt;br /&gt;
   Se asume que está  dentro de una región parallel. Mirar clausulas.&lt;br /&gt;
  Sections.- Cada sección es ejecutada una vez por un thread del total (de threads). Diferentes&lt;br /&gt;
   secciones pueden ser ejecutadas por diferentes threads.&lt;br /&gt;
 single.- El código sólo es ejecutado por un thread del total.&lt;br /&gt;
 barrier.- Sincroniza todos los threads en ejecución.  Cuando un thread alcanza esta directiva espera hasta que&lt;br /&gt;
  todos los demás threads lleguen a este punto y a continuación todos los threads se continuan ejecutando&lt;br /&gt;
  en paralelo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Opciones de compilación.&lt;br /&gt;
 -xopenmp.-  Equivalent to -xopenmp=parallel&lt;br /&gt;
 -xopenmp=parallel.-  Enables recognition of OpenMP pragmas Requires at least optimization level -xO3&lt;br /&gt;
 -xopenmp=noopt.-  Enables recognition of OpenMP pragmas The program is parallelized accordingly, but no&lt;br /&gt;
  optimization is done *&lt;br /&gt;
 -xopenmp=none.- Disables recognition of OpenMP pragmas (default)&lt;br /&gt;
 -xloopinfo.- Display parallelization messages on screen&lt;br /&gt;
 -stackvar.- Allocate local data on the stack (Fortran only) Use this when calling functions in parallel&lt;br /&gt;
  Included with -xopenmp=parallel | noopt&lt;br /&gt;
 -vpara/-xvpara.- Reports OpenMP scoping errors in case of incorrect parallelization (Fortran and C compiler only)&lt;br /&gt;
  Also reports OpenMP scoping errors and race conditions statically detected by the compiler&lt;br /&gt;
 -XlistMP.- Reports warnings about possible errors in OpenMP parallelization (Fortran only)&lt;br /&gt;
 -xcommonchk.- option to report upon inconsistentusage of threadprivate</description><link>http://jferconde.blogspot.com/2011/10/apuntes-openmp.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-8987189506334341631</guid><pubDate>Wed, 21 Sep 2011 16:33:00 +0000</pubDate><atom:updated>2011-09-21T18:33:29.560+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">qlearnphrases</category><title>Video qlearnphrases</title><description>Video sobre como usar qlearnphrases. &lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;459&quot; height=&quot;344&quot; src=&quot;http://www.youtube.com/embed/EHenOojG-Ng?fs=1&quot; frameborder=&quot;0&quot; allowFullScreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Todavía sigo luchando con el algoritmo para crear textos decentes. En concreto estoy intentando que a partir de un título, se cree un texto relacionado con el texto. Estoy publicando los resultados en este otro blog: &lt;a href=&quot;http://labibliaesverso.blogspot.com&quot;&gt;La biblia es verso&lt;/a&gt;.</description><link>http://jferconde.blogspot.com/2011/09/video-qlearnphrases.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/EHenOojG-Ng/default.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-158489312956637388</guid><pubDate>Wed, 07 Sep 2011 17:09:00 +0000</pubDate><atom:updated>2011-09-07T19:09:16.867+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c++</category><category domain="http://www.blogger.com/atom/ns#">divertimentosinformaticos</category><category domain="http://www.blogger.com/atom/ns#">git</category><category domain="http://www.blogger.com/atom/ns#">qlearnphrases</category><category domain="http://www.blogger.com/atom/ns#">qt</category><category domain="http://www.blogger.com/atom/ns#">redes probabilisticas</category><title>qlearnphrases</title><description>A raiz de un articulo publicado en en &lt;a href=&quot;http://divertimentosinformaticos.blogspot.com/2011/08/suenan-los-ordenadores-con-imitar.html&quot;&gt;divertimentosinformaticos&lt;/a&gt; he desarrollado una pequeña aplicación llamada qlearnphrases.&lt;br /&gt;
&lt;br /&gt;
El fin de esta aplicación es aprender palabras y formar frases con más o menos sentido de las palabras aprendidas. Admite dos métodos para aprender palabras; desde fichero de texto y desde una caja de texto. &lt;br /&gt;
&lt;br /&gt;
Además permite guardar las palabras aprendidas a fichero, aunque el almacenamiento no es muy optimo. Y saca un listado con todas las palabras aprendidas ordenadas por orden alfabético y con enlaces a las posibles palabras que le sucederán en las frases generadas.&lt;br /&gt;
&lt;br /&gt;
He subido a &lt;a href=&quot;http://code.google.com/p/qlearnphrases/&quot;&gt;google code&lt;/a&gt; el código del proyecto, para obtenerlo basta con escribir desde consola;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;git clone https://code.google.com/p/qlearnphrases/
&lt;/pre&gt;&lt;br /&gt;
He usado git, porque nunca había trabajado con este gestor de código y siempre viene bien aprender algo nuevo.&lt;br /&gt;
&lt;br /&gt;
Por lo demás sólo decir que el código no es muy decente, no libero ningún tipo de memoria, pero sólo es la primera versión, esper poder ir mejorando el programa poco a poco.&lt;br /&gt;
&lt;br /&gt;
Como ejemplo la siguiente es una frase generada automáticamente por el programa:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Ser maestro implica gran prestigio y lo siguiente:&lt;br /&gt;
Que si dentro de los misales y Usuarios OCU asciende a la zona de ahorros.&lt;br /&gt;
Y como futuros docentes a la posterior se trata de nosotros. &lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
No es muy coherente pero tengo que mejorar muchas cosas antes de ponerme a perfeccionar el algoritmo para generar frases.&lt;br /&gt;
&lt;br /&gt;
Enjoy developing :)</description><link>http://jferconde.blogspot.com/2011/09/qlearnphrases.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-6871979177542755926</guid><pubDate>Fri, 26 Aug 2011 09:55:00 +0000</pubDate><atom:updated>2011-08-26T11:55:00.632+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">qt</category><category domain="http://www.blogger.com/atom/ns#">QTableWidget</category><category domain="http://www.blogger.com/atom/ns#">QTableWidgetSelectionRange</category><category domain="http://www.blogger.com/atom/ns#">qtjambi</category><title>Deselecionar filas en un QTableWidget.</title><description>&lt;br /&gt;
He estado intentando eliminar la selección de una tabla &lt;a href=&quot;http://doc.qt.nokia.com/latest/qtablewidget.html&quot;&gt;QTableWidget&lt;/a&gt;, y la verdad es que me he demorado más de lo común debido a la forma en que se hace con qt.&lt;br /&gt;
&lt;br /&gt;
La forma que me ha resultado más sencilla es la siguiente:&lt;br /&gt;
&lt;br /&gt;
- Obtenemos el rango seleccionado mediante la función &lt;a href=&quot;http://doc.qt.nokia.com/latest/qtablewidget.html#selectedRanges&quot;&gt;selectedRanges()&lt;/a&gt; del &lt;a href=&quot;http://doc.qt.nokia.com/latest/qtablewidget.html&quot;&gt;QTableWidget&lt;/a&gt;.&lt;br /&gt;
- Vamos recorriendo el rango y llamando a la función &lt;a href=&quot;http://doc.qt.nokia.com/latest/qtablewidget.html#setRangeSelected&quot;&gt;setRangeSelected()&lt;/a&gt; pasandole cada uno de los elementos &lt;a href=&quot;http://doc.qt.nokia.com/latest/qtablewidgetselectionrange.html&quot;&gt;QTableWidgetSelectionRange&lt;/a&gt; y el parámetro false para quitar la selección.&lt;br /&gt;
&lt;br /&gt;
Aquí dejo el código de ejemplo, está hecho en java con &lt;a href=&quot;http://en.wikipedia.org/wiki/Qt_Jambi&quot;&gt;qtjambi&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;      List&lt;QTableWidgetSelectionRange&gt; unselectRange = ui.tableWidgetUsers.selectedRanges();
      for(QTableWidgetSelectionRange range : unselectRange)
      {
        ui.tableWidgetUsers.setRangeSelected(range, false);
      }
&lt;/pre&gt;</description><link>http://jferconde.blogspot.com/2011/08/deselecionar-filas-en-un-qtablewidget.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>1</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-7314777990353633418</guid><pubDate>Fri, 19 Aug 2011 19:09:00 +0000</pubDate><atom:updated>2011-08-19T21:09:48.599+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diff</category><category domain="http://www.blogger.com/atom/ns#">patch</category><category domain="http://www.blogger.com/atom/ns#">tips</category><title>Aplicando parches con diff.</title><description>En los proyectos de software libre es común que los programadores envíen sus parches de código fuente a un proyecto dado. La forma de aplicar los parches es con el comando patch.&lt;br /&gt;
&lt;br /&gt;
Supongamos que tenemos el siguiente código fuente:&lt;br /&gt;
fib1.c &lt;br /&gt;
&lt;pre&gt;#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

/* Find the nth Fibonacci number. */
static int fib(int n)
{
  if (n &lt;= 0)
    return 0;
  if (n == 1)
    return 1;
  return fib(n - 1) + fib(n - 2);
}

int main(int argc, char** argv)
{
  if (argc &lt; 2) {
    fprintf(stderr, &quot;Need an argument.\n&quot;);
    return 1;
  }

  printf(&quot;%d\n&quot;, fib(atoi(argv[1])));
  return 0;
}&lt;/pre&gt;

Y hemos recibido el siguiente parche:

fib-linear-time.patch 
&lt;pre&gt;--- fib1.c 
+++ fib2.c 
@@ -4,11 +4,17 @@
 /* Find the nth Fibonacci number. */
 static int fib(int n)
 {
-  if (n &lt;= 0)
-    return 0;
-  if (n == 1)
-    return 1;
-  return fib(n - 1) + fib(n - 2);
+  int prev = 1;
+  int current = 0;
+  int i;
+
+  for (i = 0; i &lt; n; i++) {
+    int next = current + prev;
+    prev = current;
+    current = next;
+  }
+
+  return current;
 }
 
 int main(int argc, char** argv)&lt;/pre&gt;


Para aplicar el parche simplemente debemos ejecutar la siguiente orden desde consola:

&lt;blockquote&gt;patch &lt; fib-linear-time.patch&lt;/blockquote&gt;

Y con esto nuestro archivo fib1.c quedaría de la forma siguiente:

fib1.c
&lt;pre&gt;#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

/* Find the nth Fibonacci number. */
static int fib(int n)
{
  int prev = 1;
  int current = 0;
  int i;

  for (i = 0; i &lt; n; i++) {
    int next = current + prev;
    prev = current;
    current = next;
  }

  return current;
}

int main(int argc, char** argv)
{
  if (argc &lt; 2) {
    fprintf(stderr, &quot;Need an argument.\n&quot;);
    return 1;
  }

  printf(&quot;%d\n&quot;, fib(atoi(argv[1])));
  return 0;
}&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</description><link>http://jferconde.blogspot.com/2011/08/aplicando-parches-con-diff.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-4783865445973474920</guid><pubDate>Thu, 18 Aug 2011 22:18:00 +0000</pubDate><atom:updated>2011-08-19T00:18:27.827+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c++</category><category domain="http://www.blogger.com/atom/ns#">const char</category><category domain="http://www.blogger.com/atom/ns#">programación</category><category domain="http://www.blogger.com/atom/ns#">QString</category><category domain="http://www.blogger.com/atom/ns#">qt</category><title>QString to const char*. Convetir QString a const char*</title><description>Cuando empezamos a programar en qt es común que no sepamos convertir converir un QString en char*. &lt;br /&gt;
Una forma rápida y sencilla de convertir un QString en un const char* es la siguiente.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;    String str(&quot;hello&quot;);&lt;br /&gt;
    const char* ch = str.toLocal8Bit().constData();&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
</description><link>http://jferconde.blogspot.com/2011/08/qstring-to-const-char-convetir-qstring.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-59656596182306912</guid><pubDate>Mon, 15 Aug 2011 17:34:00 +0000</pubDate><atom:updated>2011-08-15T19:34:26.075+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">qDebug</category><category domain="http://www.blogger.com/atom/ns#">QString</category><category domain="http://www.blogger.com/atom/ns#">qt</category><category domain="http://www.blogger.com/atom/ns#">tips qt</category><title>Usar qDebug con QString</title><description>Últimamente he estado teniendo problemas al usar la función qDebug y pasarle un QString como parámetro. &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&quot;no matching function for call to &#39;qDegug(Qstring&amp;)&quot;&lt;/blockquote&gt;&lt;br /&gt;
El problema, como podemos ver, es que no hay ninguna función qDebug que acepte un QString como parámetro.&lt;br /&gt;
&lt;br /&gt;
La solución es usar el operador &lt;&lt; para indicarle que QString queremos imprimir.

Sería algo así:

&lt;blockquote&gt;&lt;br /&gt;
QString text(&quot;hello qt&quot;);&lt;br /&gt;
qDegug() &lt;&lt; text;
&lt;/blockquote&gt;</description><link>http://jferconde.blogspot.com/2011/08/usar-qdebug-con-qstring.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-3150145136915861843</guid><pubDate>Mon, 25 Jul 2011 16:38:00 +0000</pubDate><atom:updated>2011-07-25T18:38:40.635+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">infobasic</category><category domain="http://www.blogger.com/atom/ns#">QActions</category><category domain="http://www.blogger.com/atom/ns#">qt</category><category domain="http://www.blogger.com/atom/ns#">QToolBar</category><title>Añadir elementos a una QToolBar</title><description>Para añadir elementos desde el diseñador a una QToolBar hace falta en primer lugar crear QActions, estos se pueden crear fácilmente desde la vista de diseñar widgets, una vez creados, hay que pinchar sobre el QAction en cuestión que queremos añadir y arrastrarlo hacia la QToolBar.&lt;br /&gt;
&lt;br /&gt;
Además si queremos que los QActions luzcan con icono, debemos crearnos un fichero de recursos qrc, allí iremos importando los iconos necesarios y posteriormente se los asignamos a los QActions.&lt;br /&gt;
&lt;br /&gt;
Acabo de crear los botones de la barra de herramientas de la aplicación y de asignarle sus iconos correspondientes. He obtenido los iconos de &lt;a href=&quot;http://www.freeiconsdownload.com/Free_Downloads.asp?id=255&quot;&gt;freeiconsdownload&lt;/a&gt; ya que tienen una licencia que permite usarlos en proyectos no comercial.&lt;br /&gt;
&lt;br /&gt;
Dejo una captura de pantalla del estado actual de la aplicación. En principio está desarrollada como MDI.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0D_y98BYLY6QUHGQrBvqIjwUHnk2lNlTqkhyphenhyphenTw8W6aWuqSyaBgqTdAWYOy9rBXIngTGIcJtB_XXFbXutJs8jNXskJYJc7sQNs5Y4HrLcFhjZ8a-Dpq1D1NOW0xUigZbP8mJBLxBdYRWNC/s1600/infobasic-0.04.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;230&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0D_y98BYLY6QUHGQrBvqIjwUHnk2lNlTqkhyphenhyphenTw8W6aWuqSyaBgqTdAWYOy9rBXIngTGIcJtB_XXFbXutJs8jNXskJYJc7sQNs5Y4HrLcFhjZ8a-Dpq1D1NOW0xUigZbP8mJBLxBdYRWNC/s400/infobasic-0.04.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
El código de esta versión se puede descargar desde aquí:&lt;br /&gt;
&lt;br /&gt;
svn checkout http://infobasic.googlecode.com/svn/tags/infobasic-0.0.4 infobasic-read-only</description><link>http://jferconde.blogspot.com/2011/07/anadir-elementos-una-qtoolbar.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0D_y98BYLY6QUHGQrBvqIjwUHnk2lNlTqkhyphenhyphenTw8W6aWuqSyaBgqTdAWYOy9rBXIngTGIcJtB_XXFbXutJs8jNXskJYJc7sQNs5Y4HrLcFhjZ8a-Dpq1D1NOW0xUigZbP8mJBLxBdYRWNC/s72-c/infobasic-0.04.png" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-8037118937143598765</guid><pubDate>Mon, 25 Jul 2011 11:17:00 +0000</pubDate><atom:updated>2011-07-25T13:17:54.555+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c++</category><category domain="http://www.blogger.com/atom/ns#">echo</category><category domain="http://www.blogger.com/atom/ns#">infobasic</category><category domain="http://www.blogger.com/atom/ns#">programación</category><category domain="http://www.blogger.com/atom/ns#">qt</category><category domain="http://www.blogger.com/atom/ns#">server</category><category domain="http://www.blogger.com/atom/ns#">udp</category><title>Servidor simple de echo UDP</title><description>Ya tengo listo el servidor UDP de echo, la verdad es que las herramientas que nos brindan las librerías Qt son muy potentes y fáciles de usar.&lt;br /&gt;
&lt;br /&gt;
echoserver.h&lt;br /&gt;
&lt;pre&gt;#ifndef ECHOSERVER_H
#define ECHOSERVER_H

#include &quot;IForm.h&quot;
#include &lt;QWidget&gt;
#include &lt;QUdpSocket&gt;

namespace Ui {
    class EchoServer;
}

class EchoServer : public QWidget
{
    Q_OBJECT

public:
    explicit EchoServer(QWidget *parent = 0);
    virtual ~EchoServer();
    static const quint16 PORT_MIN;
    static const quint16 PORT_MAX;
    static const quint16 PORT_DEFAULT;

protected:
    QUdpSocket *udpServer;

    virtual void putTexts();
    virtual void setuid();

    static const QString START;
    static const QString STOP;

public slots:
    void onClickStart();
    void readPendingDatagrams();

private:
    Ui::EchoServer *ui;
    bool started;

};

#endif // ECHOSERVER_H
&lt;/pre&gt;&lt;br /&gt;
echoserver.cpp&lt;br /&gt;
&lt;pre&gt;#include &quot;echoserver.h&quot;
#include &quot;ui_echoserver.h&quot;
#include &lt;QDateTime&gt;

const quint16 EchoServer::PORT_MIN = 1;
const quint16 EchoServer::PORT_MAX = 65535;
const quint16 EchoServer::PORT_DEFAULT = 8888;

const QString EchoServer::START = tr(&quot;Start&quot;);
const QString EchoServer::STOP = tr(&quot;Stop&quot;);

EchoServer::EchoServer(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::EchoServer)
{
    ui-&gt;setupUi(this);
    this-&gt;udpServer = new QUdpSocket(this);
    this-&gt;started = false;
    putTexts();
    setuid();    
}

EchoServer::~EchoServer()
{
    delete ui;
    delete this-&gt;udpServer;
    qDebug(&quot;Delete EchoServer&quot;);
}

void EchoServer::putTexts()
{
    this-&gt;setWindowTitle(tr(&quot;Servidor echo UDP&quot;));
    ui-&gt;lbPort-&gt;setText(tr(&quot;Port&quot;));
    ui-&gt;pbStart-&gt;setText(tr(&quot;Start&quot;));
}

void EchoServer::setuid()
{
    setAttribute(Qt::WA_DeleteOnClose);
    connect(ui-&gt;pbStart, SIGNAL(clicked()),SLOT(onClickStart()));
    connect(ui-&gt;sldPort, SIGNAL(valueChanged(int)), ui-&gt;lcdPort, SLOT(display(int)));

    ui-&gt;sldPort-&gt;setMinimum(EchoServer::PORT_MIN);
    ui-&gt;sldPort-&gt;setMaximum(EchoServer::PORT_MAX);
    ui-&gt;sldPort-&gt;setValue(EchoServer::PORT_DEFAULT);
}

void EchoServer::onClickStart()
{

    if(!this-&gt;started)
    {
        qDebug(&quot;Server started&quot;);
        quint16 port = ui-&gt;lcdPort-&gt;value();
        udpServer-&gt;bind(port, QUdpSocket::ShareAddress);
        connect(udpServer, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
        ui-&gt;pbStart-&gt;setText(STOP);
    } else
    {
        qDebug(&quot;Server stoped&quot;);
        udpServer-&gt;close();
        ui-&gt;pbStart-&gt;setText(START);
    }

    this-&gt;started = !this-&gt;started;
}

void EchoServer::readPendingDatagrams()
{
    qDebug(&quot;readPendingDatagrams&quot;);
    while (udpServer-&gt;hasPendingDatagrams())
    {
         QByteArray datagram;
         datagram.resize(udpServer-&gt;pendingDatagramSize());
         QHostAddress sender;
         quint16 senderPort;

         udpServer-&gt;readDatagram(datagram.data(), datagram.size(),
                                 &amp;sender, &amp;senderPort);

         QString str(datagram);
         str.append(&quot; from &quot; + sender.toString() + &quot; on &quot; + QDateTime::currentDateTime().toString()+ &quot;\n&quot;);
         ui-&gt;textBrowser-&gt;insertPlainText(str);
         udpServer-&gt;writeDatagram(datagram, sender, senderPort);
     }
}
&lt;/pre&gt;&lt;br /&gt;
Para iniciar el servidor, simplemente hay que indicar el puerto por el que escuchará y el modo. Además hay que conectar la llegada de paquetes a una función, en este caso la función es readPendingDatagrams() y se ejecutará cada vez que llegue un paquete UDP.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;quint16 port = ui-&gt;lcdPort-&gt;value();
udpServer-&gt;bind(port, QUdpSocket::ShareAddress);
connect(udpServer, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
&lt;/pre&gt;        &lt;br /&gt;
En la función readPendingDatagrams() es donde se realiza el procesamiento de datos y se monta la respuesta para el cliente. En este caso el procesamiento de datos consiste en sacar los datos recibidos por pantalla y la respuesta contiene exactamente los mismos datos que se han recibido.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;while (udpServer-&gt;hasPendingDatagrams())
{
     QByteArray datagram;
     datagram.resize(udpServer-&gt;pendingDatagramSize());
     QHostAddress sender;
     quint16 senderPort;

     udpServer-&gt;readDatagram(datagram.data(), datagram.size(),&amp;sender, &amp;senderPort);

     QString str(datagram);
     str.append(&quot; from &quot; + sender.toString() + &quot; on &quot; + QDateTime::currentDateTime().toString()+ &quot;\n&quot;);
     ui-&gt;textBrowser-&gt;insertPlainText(str);
     udpServer-&gt;writeDatagram(datagram, sender, senderPort);
}
&lt;/pre&gt;&lt;br /&gt;
Como siempre podeis descargar el código desde el svn, para esta versión en concreto desde aquí:&lt;br /&gt;
&lt;pre&gt;svn checkout http://infobasic.googlecode.com/svn/tags/infobasic-0.0.3 infobasic-read-only
&lt;/pre&gt;</description><link>http://jferconde.blogspot.com/2011/07/servidor-simple-de-echo-udp.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-111278364096535316</guid><pubDate>Mon, 25 Jul 2011 08:44:00 +0000</pubDate><atom:updated>2011-07-25T10:45:04.129+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programación</category><category domain="http://www.blogger.com/atom/ns#">qt</category><category domain="http://www.blogger.com/atom/ns#">tips qt</category><title>QByteArray to QString</title><description>Para convertir un objeto QByteArray a QString simplemente hay que pasarle el QByteArray al QString en el constructor. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;QByteArray datagram;

... //Suponemos que el QByteArray tiene datos. 

QString str(datagram);
&lt;/pre&gt;</description><link>http://jferconde.blogspot.com/2011/07/qbytearray-to-qstring.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-6168283142182947133</guid><pubDate>Sun, 24 Jul 2011 10:56:00 +0000</pubDate><atom:updated>2011-07-24T12:56:46.875+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c</category><category domain="http://www.blogger.com/atom/ns#">c++</category><category domain="http://www.blogger.com/atom/ns#">client</category><category domain="http://www.blogger.com/atom/ns#">echo</category><category domain="http://www.blogger.com/atom/ns#">infobasic</category><category domain="http://www.blogger.com/atom/ns#">programación</category><category domain="http://www.blogger.com/atom/ns#">svn</category><title>Cliente simple echo. UDP. Añadida selección de puerto.</title><description>Se ha añadido al cliente echo udp, la selección de puerto, para ello se ha usado un QSlider y un QLCDNumber. &lt;br /&gt;
&lt;br /&gt;
Conectamos el valor producido por el QSlider al valor mostrado en el QLCDNumber y configuramos los valore máximos y mínimos del QSlider a los valores de puerto máximo y mínimo respectivamente.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;const quint16 EchoClient::PORT_MIN = 1;
const quint16 EchoClient::PORT_MAX = 65535;
const quint16 EchoClient::PORT_DEFAULT = 8888;

...

void EchoClient::setuid()
{
    setAttribute(Qt::WA_DeleteOnClose);
    connect(ui-&gt;pbSend, SIGNAL(clicked()),SLOT(onClickSend()));
    connect(ui-&gt;sldPort, SIGNAL(valueChanged(int)), ui-&gt;lcdPort, SLOT(display(int)));

    ui-&gt;sldPort-&gt;setMinimum(EchoClient::PORT_MIN);
    ui-&gt;sldPort-&gt;setMaximum(EchoClient::PORT_MAX);
    ui-&gt;sldPort-&gt;setValue(EchoClient::PORT_DEFAULT);
}
&lt;/pre&gt;&lt;br /&gt;
Por último en la función de enviar cogemos el valor del puerto del QLCDNumber y lo enviamos al host especificado en el QLineEdit.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;void EchoClient::onClickSend()
{
    qDebug(&quot;onClickSend&quot;);

    QHostInfo info = QHostInfo::fromName(ui-&gt;leServerName-&gt;text());
    if (!info.addresses().isEmpty())
    {
        QHostAddress address = info.addresses().first();
        QByteArray ba = ui-&gt;leText-&gt;text().toLocal8Bit();
        const char *txt = ba.data();
        qint16 len = ui-&gt;leText-&gt;text().length();
        qint16 port = ui-&gt;sldPort-&gt;value();

        QUdpSocket *udp =new QUdpSocket(this);
        udp-&gt;writeDatagram(txt, len, address,  port);
        delete udp;
    } else
    {
        QMessageBox msgBox;
        msgBox.setWindowTitle(tr(&quot;Error&quot;));
        msgBox.setText(tr(&quot;Error host not found&quot;));
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.exec();
    }
}

Para descargar esta versión:&lt;/p&gt;&lt;p&gt;svn checkout http://infobasic.googlecode.com/svn/tags/infobasic-0.0.2 infobasic-read-only&lt;/p&gt;&lt;/pre&gt;</description><link>http://jferconde.blogspot.com/2011/07/cliente-simple-echo-udp-anadida.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-1531943602149233178</guid><pubDate>Sat, 23 Jul 2011 18:13:00 +0000</pubDate><atom:updated>2011-07-23T20:13:02.767+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">google code</category><category domain="http://www.blogger.com/atom/ns#">infobasic</category><category domain="http://www.blogger.com/atom/ns#">svn</category><title>Nuevas tareas en google code.</title><description>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;p&gt;Voy a ir definiendo las próximas acciones de desarrollo en google code. No se muy bien en que va a acabar la aplicación pero la idea es que poco a poco se vayan definiendo nuevas tareas y objetivos para seguir practicando con las herramientas que nos proveen las librerias qt. Las nuevas tareas se irán definiendo en la siguiente página. &lt;a target=&#39;_blank&#39; title=&#39;Lista de tareas&#39; href=&#39;http://code.google.com/p/infobasic/issues/list&#39;&gt;http://code.google.com/p/infobasic/issues/list&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description><link>http://jferconde.blogspot.com/2011/07/nuevas-tareas-en-google-code.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-5420823690967058857</guid><pubDate>Sat, 23 Jul 2011 18:01:00 +0000</pubDate><atom:updated>2011-07-23T20:04:06.731+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c++</category><category domain="http://www.blogger.com/atom/ns#">client</category><category domain="http://www.blogger.com/atom/ns#">ip</category><category domain="http://www.blogger.com/atom/ns#">programación</category><category domain="http://www.blogger.com/atom/ns#">qt</category><category domain="http://www.blogger.com/atom/ns#">udp</category><title>Analisis de datos enviados por el cliente udp.</title><description>&lt;p&gt;Al capturar los datos enviado por nuestro &lt;a href=&quot;http://jferconde.blogspot.com/2011/07/cliente-simple-echo-udp.html&quot;&gt;cliente de echo UDP&lt;/a&gt; obteniamos la siguiente secuencia de bytes:&lt;/p&gt;&lt;pre&gt;0x0000:  4500 0028 0000 4000 4011 3cc3 7f00 0001  E..(..@.@.&lt;.....
0x0010:  7f00 0001 df38 22b8 0014 fe27 6865 6c6c  .....8&quot;....&#39;hell
0x0020:  6f20 7365 7276 6572                      o.server
&lt;/pre&gt;
&lt;p&gt;Teniendo en cuenta que el encabezado de un paquete UDP es el siguiente: &lt;/p&gt;&lt;table border=&quot;1&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td width=&quot;30%&quot;&gt;&lt;center&gt;puerto de origen&lt;br /&gt;
(16 bits)&lt;/center&gt;&lt;/td&gt; &lt;td width=&quot;30%&quot;&gt;&lt;center&gt;puerto de destino&lt;br /&gt;
(16 bits)&lt;/center&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;30%&quot;&gt;&lt;center&gt;longitud total&lt;br /&gt;
(16 bits)&lt;/center&gt;&lt;/td&gt; &lt;td width=&quot;30%&quot;&gt;&lt;center&gt;suma de comprobación del encabezado&lt;br /&gt;
(16 bits)&lt;/center&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td width=&quot;60%&quot; colspan=&quot;2&quot;&gt;&lt;center&gt;datos &lt;br /&gt;
(longitud variable).&lt;/center&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Tenemos que:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Puerto origen:&lt;/b&gt; df38 (2 bytes)&lt;br&gt;
&lt;b&gt;Puerto destino:&lt;/b&gt; 22b8 (2 bytes. 0x22b8 es 8888 en decimal)&lt;br&gt;
&lt;b&gt;Longitud total:&lt;/b&gt; 0014 (2 bytes. La longitud total es de 20 bytes, es decir 0x14 en hexadecimal)&lt;br&gt;
&lt;b&gt;Checksum:&lt;/b&gt; fe27 (2 bytes)&lt;br&gt;

Datos enviados: 6865 6c6c 6f20 7365 7276 6572 (12 bytes)
&lt;/p&gt;&lt;p&gt;Los datos anteriores corresponde al protocolo IP en el que va montada la trama UDP.&lt;/p&gt;&lt;pre&gt;0x0000:  4500 0028 0000 4000 4011 3cc3 7f00 0001  E..(..@.@.&lt;.....
0x0010:  7f00 0001
&lt;/pre&gt;
&lt;p&gt;Y su significado es el siguiente:&lt;/p&gt;&lt;b&gt;Versión:&lt;/b&gt; 45 (4 bits 1/2 byte, 0100 significa que se está usando la versión IPV4)&lt;br&gt;
&lt;b&gt;Longitud del encabezado:&lt;/b&gt; 00 (4 bits, 1/2 byte, 0101 es decir 5 en decimal)&lt;br&gt;
&lt;b&gt;Tipo de servicio:&lt;/b&gt; 00 (1 bytes)&lt;br&gt;
&lt;b&gt;Longitud total:&lt;/b&gt; 0028 (2 bytes, corresponde a una longitude de 40 bytes)&lt;br&gt;
&lt;b&gt;Identificación:&lt;/b&gt; 0000 (2 bytes)&lt;br&gt;
&lt;b&gt;Fragment offset:&lt;/b&gt; 4000 (2 bytes)&lt;br&gt;
&lt;b&gt;Tiempo de vida:&lt;/b&gt; 40 (1 byte)&lt;br&gt;
&lt;b&gt;Protocolo:&lt;/b&gt; 11 (1 byte, corresponde al protocolo UDP 17 en decimal)&lt;br&gt;
&lt;b&gt;Checksum de la cabecera:&lt;/b&gt; 3cc3 (2 bytes)&lt;br&gt;
&lt;b&gt;Dirección origen:&lt;/b&gt; 7f00 0001 (4 bytes, 127.0.0.1)&lt;br&gt;
&lt;b&gt;Dirección destino:&lt;/b&gt; 7f00 0001 (4 bytes, 127.0.0.1)&lt;br&gt;
&lt;/p&gt;&lt;p&gt;El formato de un paquete IP es el siguiente: &lt;/p&gt;&lt;table border=&quot;1&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td width=&quot;60&quot;&gt;&lt;center&gt;Versión&lt;br /&gt;
(4 bits)&lt;/center&gt;&lt;/td&gt; &lt;td width=&quot;60&quot;&gt;&lt;center&gt;Longitud del encabezado&lt;br /&gt;
(4 bits)&lt;/center&gt;&lt;/td&gt; &lt;td width=&quot;120&quot;&gt;&lt;center&gt;Tipo de servicio &lt;br /&gt;
(8 bits)&lt;/center&gt;&lt;/td&gt; &lt;td width=&quot;240&quot; colspan=&quot;2&quot;&gt;&lt;center&gt;Longitud total&lt;br /&gt;
(16 bits)&lt;/center&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td colspan=&quot;3&quot;&gt;&lt;center&gt;Identificación &lt;br /&gt;
(16 bits)&lt;/center&gt;&lt;/td&gt; &lt;td&gt;&lt;center&gt;Indicador &lt;br /&gt;
(3 bits)&lt;/center&gt;&lt;/td&gt; &lt;td&gt;&lt;center&gt;Margen del fragmento &lt;br /&gt;
(13 bits)&lt;/center&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td colspan=&quot;2&quot;&gt;&lt;center&gt;Tiempo de vida &lt;br /&gt;
(8 bits)&lt;/center&gt;&lt;/td&gt; &lt;td&gt;&lt;center&gt;Protocolo &lt;br /&gt;
(8 bits)&lt;/center&gt;&lt;/td&gt; &lt;td colspan=&quot;2&quot;&gt;&lt;center&gt;Suma de comprobación del encabezado&lt;br /&gt;
(16 bits)&lt;/center&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td colspan=&quot;5&quot;&gt;&lt;center&gt;Dirección IP de origen (32 bits)&lt;/center&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td colspan=&quot;5&quot;&gt;&lt;center&gt;Dirección IP de destino (32 bits)&lt;/center&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td colspan=&quot;5&quot;&gt;&lt;center&gt;Datos&lt;/center&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
En los posteriores post intentaré analizar cuales son las diferencias al utilizar diferentes protocolos como TCP y diferentes puertos para el cliente de echo.</description><link>http://jferconde.blogspot.com/2011/07/analisis-de-datos-enviados-por-el.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-7198274207371894418</guid><pubDate>Sat, 23 Jul 2011 16:02:00 +0000</pubDate><atom:updated>2011-07-23T18:31:52.494+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programación</category><category domain="http://www.blogger.com/atom/ns#">qt</category><category domain="http://www.blogger.com/atom/ns#">svn</category><title>Infobasic svn</title><description>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;p&gt;Acabo de subir el código del programa ejemplo infobasic al un repositorio en google code. La dirección para descargar la rama principal es la siguiente:&lt;/p&gt;&lt;p&gt;svn checkout http://infobasic.googlecode.com/svn/trunk/ infobasic-read-only&lt;/p&gt;&lt;p&gt;Para descargar la versión que tiene como último elemento añadido la el diálogo de about:&lt;/p&gt;&lt;p&gt;svn checkout http://infobasic.googlecode.com/svn/tags/infobasic-0.0.1 infobasic-read-only&lt;/p&gt;&lt;/div&gt;</description><link>http://jferconde.blogspot.com/2011/07/infobasic-svn.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-4472719128334663874</guid><pubDate>Wed, 20 Jul 2011 20:34:00 +0000</pubDate><atom:updated>2011-07-20T22:54:50.270+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c++</category><category domain="http://www.blogger.com/atom/ns#">programación</category><category domain="http://www.blogger.com/atom/ns#">QDesktopServices</category><category domain="http://www.blogger.com/atom/ns#">qlabel</category><category domain="http://www.blogger.com/atom/ns#">qt</category><title>Convertir un label en un hipervinculo.</title><description>Hay raiz de una consulta en el foro de &lt;a href=&quot;http://www.zonaqt.com/foro/como-hago-para-convertir-un-label-en-un-hipervinculo&quot;&gt;zonaqt&lt;/a&gt; he ampliado mi programa InfoBasic para ponerle un dialogo con un enlace a la esta misma web. Aquí dejo el código:&lt;br /&gt;
&lt;br /&gt;
aboutdialog.h&lt;br /&gt;
&lt;pre&gt;#ifndef ABOUTDIALOG_H
#define ABOUTDIALOG_H

#include &quot;IForm.h&quot;
#include &lt;QDialog&gt;

namespace Ui {
    class AboutDialog;
}

class AboutDialog : public QDialog, public IForm
{
    Q_OBJECT

public:
    static const char* HREF;
    static const char* HREF2;
    explicit AboutDialog(QWidget *parent = 0);
    ~AboutDialog();

    virtual void putTexts();
    virtual void setuid();

public slots:
    void onClickLink();

private:
    Ui::AboutDialog *ui;
};

#endif // ABOUTDIALOG_H
&lt;/pre&gt;&lt;br /&gt;
aboutdialog.cpp&lt;br /&gt;
&lt;pre&gt;#include &quot;aboutdialog.h&quot;
#include &quot;ui_aboutdialog.h&quot;
#include &lt;QUrl&gt;
#include &lt;QDesktopServices&gt;

const char* AboutDialog::HREF =&quot;&lt;a href=&#39;http://jferconde.blogspot.com/&#39;&gt;Org&amp;iacute;a de objetos&lt;/a&gt;&quot;;
const char* AboutDialog::HREF2 =&quot;&lt;a href=&#39;http://jferconde.blogspot.com/&#39;&gt;Thank you for visiting us.&lt;/a&gt;&quot;;

AboutDialog::AboutDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::AboutDialog)
{
    ui-&gt;setupUi(this);
    putTexts();
    setuid();
}

AboutDialog::~AboutDialog()
{
    delete ui;
}

void AboutDialog::onClickLink()
{
    qDebug(&quot;onClickLink&quot;);
    QString str = ui-&gt;labelLink-&gt;text();
    int startIndex = str.indexOf(QString(&quot;&#39;&quot;));
    int endIndex = str.indexOf(QString(&quot;&#39;&quot;), ++startIndex);
    qDebug(str.mid(startIndex, endIndex).toLocal8Bit().data());
    QDesktopServices::openUrl(QUrl(str.mid(startIndex, endIndex - startIndex)));
    ui-&gt;labelLink-&gt;setText(HREF2);
}

void AboutDialog::putTexts()
{
    ui-&gt;labelLink-&gt;setText(HREF);
    ui-&gt;labelLink-&gt;adjustSize();
}

void AboutDialog::setuid()
{
    connect(ui-&gt;labelLink, SIGNAL(linkActivated(QString)), this, SLOT(onClickLink()));
}
&lt;/pre&gt;&lt;br /&gt;
Este código abre la dirección del QLabel en el explorador por defecto.&lt;br /&gt;
&lt;br /&gt;
En los próximos días voy a intentar sacar tiempo para subir el código fuente.</description><link>http://jferconde.blogspot.com/2011/07/convertir-un-label-en-un-hipervinculo.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-4264850231826954336</guid><pubDate>Mon, 18 Jul 2011 21:31:00 +0000</pubDate><atom:updated>2011-07-23T18:32:59.820+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c++</category><category domain="http://www.blogger.com/atom/ns#">client</category><category domain="http://www.blogger.com/atom/ns#">programación</category><category domain="http://www.blogger.com/atom/ns#">udp</category><title>Cliente simple echo. UDP.</title><description>&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;Se trata de un cliente UDP de echo. Consta de un una caja de texto para escribir el nombre del servidor, y una otra caja de texto para enviar texto en claro al servidor. Aquí dejo la implementación de la clase principal.&lt;br /&gt;
&lt;br /&gt;
echoclient.h&lt;br /&gt;
&lt;pre&gt;#ifndef ECHOCLIENT_H
#define ECHOCLIENT_H

#include &lt; QWidget&gt;
#include &quot;IForm.h&quot;

namespace Ui {
    class EchoClient;
}

class EchoClient : public QWidget, public IForm
{
    Q_OBJECT

public:
    explicit EchoClient(QWidget *parent = 0);
    virtual ~EchoClient();

    virtual void putTexts();
    virtual void setuid();

public slots:
    void onClickSend();

private:
    Ui::EchoClient *ui;
};

#endif // ECHOCLIENT_H
&lt;/pre&gt;&lt;br /&gt;
echoclient.cpp&lt;br /&gt;
&lt;pre&gt;#include &quot;echoclient.h&quot;
#include &quot;ui_echoclient.h&quot;
#include &quot;qtudpclient.h&quot;
#include &lt; QUdpSocket&gt;
#include &lt; QHostAddress&gt;
#include &lt; iostream&gt;

EchoClient::EchoClient(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::EchoClient)
{
    ui-&gt;setupUi(this);
    putTexts();
    setuid();
}

EchoClient::~EchoClient()
{
    delete ui;
    qDebug(&quot;Delete EchoClient&quot;);
}

void EchoClient::putTexts()
{
    ui-&gt;lbServerName-&gt;setText(tr(&quot;Server Name&quot;));
    ui-&gt;lbText-&gt;setText(tr(&quot;Text&quot;));
    ui-&gt;leServerName-&gt;setText(&quot;localhost&quot;);
    ui-&gt;pbSend-&gt;setText(tr(&quot;Send&quot;));
}

void EchoClient::setuid()
{
    setAttribute(Qt::WA_DeleteOnClose);
    connect(ui-&gt;pbSend, SIGNAL(clicked()),SLOT(onClickSend()));
}

void EchoClient::onClickSend()
{
    qDebug(&quot;onClickSend&quot;);
    QUdpSocket *udp =new QUdpSocket(this);
    const QHostAddress *host = new QHostAddress(ui-&gt;leServerName-&gt;text());

    //const char *txt = (const char*) ui-&gt;leText-&gt;text().toLocal8Bit().data();
    QByteArray ba = ui-&gt;leText-&gt;text().toLocal8Bit();
    const char *txt = ba.data();
    qint16 len = ui-&gt;leText-&gt;text().length();
    qint16 port = 8888;
    udp-&gt;writeDatagram(txt, len, QHostAddress::LocalHost,  port);
    qDebug(ui-&gt;leServerName-&gt;text().toStdString().c_str());
    delete host;
    delete udp;
}

&lt;/pre&gt;Y  aquí podemos ver la información enviada al servidor: &lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;sudo tcpdump -xX -i lo
0x0000:  4500 0028 0000 4000 4011 3cc3 7f00 0001  E..(..@.@.&lt;.....
0x0010:  7f00 0001 c30e 22b8 0014 fe27 6865 6c6c  ......&quot;....&#39;hell
0x0020:  6f20 7365 7276 6572                      o.server&lt;/pre&gt;

En los próximos envíos veremos la interpretación de esta información y apliaremos el cliente para que sea capaz de recibir e interpretar las respuestas del servidor.&lt;/div&gt;</description><link>http://jferconde.blogspot.com/2011/07/cliente-simple-echo-udp.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>1</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-2270703434498614615</guid><pubDate>Mon, 18 Jul 2011 20:54:00 +0000</pubDate><atom:updated>2011-07-20T22:50:37.972+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c++</category><category domain="http://www.blogger.com/atom/ns#">patrones de diseño</category><category domain="http://www.blogger.com/atom/ns#">programación</category><category domain="http://www.blogger.com/atom/ns#">qt</category><title>Patrones de diseño.</title><description>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;p&gt;Actualmente estoy leyendo un sobre patrones de diseño, es mi intención comentar e implementar los ejemplos propuestos. Aunque el libro está orientado a programación en java intentaré desarrollar todos los ejercicios usando c++ con las librerías qt y bajo una ubuntu 11.04.&lt;/p&gt;&lt;p&gt;Además pienso ir publicando mis pequeños programas que realizarán acciones básicas con las qt.&lt;/p&gt;&lt;p&gt;&lt;img height=&#39;1&#39; width=&#39;1&#39; src=&#39;https://blogger.googleusercontent.com/tracker/7521778425930365629-8958705317668103628?l=jferconde.blogspot.com&#39;/&gt;&lt;/p&gt;&lt;p&gt;&lt;img height=&#39;1&#39; width=&#39;1&#39; src=&#39;https://blogger.googleusercontent.com/tracker/7521778425930365629-8958705317668103628?l=jferconde.blogspot.com&#39;/&gt;&lt;/p&gt;&lt;p&gt;&lt;img height=&#39;1&#39; width=&#39;1&#39; src=&#39;https://blogger.googleusercontent.com/tracker/7521778425930365629-8958705317668103628?l=jferconde.blogspot.com&#39;/&gt;&lt;/p&gt;&lt;p&gt;&lt;img height=&#39;1&#39; width=&#39;1&#39; src=&#39;https://blogger.googleusercontent.com/tracker/7521778425930365629-8958705317668103628?l=jferconde.blogspot.com&#39;/&gt;&lt;/p&gt;&lt;/div&gt;</description><link>http://jferconde.blogspot.com/2011/07/patrones-de-diseno.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7521778425930365629.post-8958705317668103628</guid><pubDate>Mon, 18 Jul 2011 20:43:00 +0000</pubDate><atom:updated>2011-07-20T22:51:46.799+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Hello world</category><title>Hello blogger!</title><description>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;&lt;p&gt;My first post from Blogilo!&lt;/p&gt;&lt;p&gt;&lt;img height=&#39;1&#39; width=&#39;1&#39; src=&#39;https://blogger.googleusercontent.com/tracker/7521778425930365629-8958705317668103628?l=jferconde.blogspot.com&#39;/&gt;&lt;/p&gt;&lt;p&gt;&lt;img height=&#39;1&#39; width=&#39;1&#39; src=&#39;https://blogger.googleusercontent.com/tracker/7521778425930365629-8958705317668103628?l=jferconde.blogspot.com&#39;/&gt;&lt;/p&gt;&lt;p&gt;&lt;img height=&#39;1&#39; width=&#39;1&#39; src=&#39;https://blogger.googleusercontent.com/tracker/7521778425930365629-8958705317668103628?l=jferconde.blogspot.com&#39;/&gt;&lt;/p&gt;&lt;/div&gt;</description><link>http://jferconde.blogspot.com/2011/07/hello-world.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total><georss:featurename>Madrid, España</georss:featurename><georss:point>40.4166909 -3.70034540000006</georss:point><georss:box>40.2509674 -3.88584290000006 40.5824144 -3.5148479000000603</georss:box></item></channel></rss>