viernes, 26 de agosto de 2011

Deselecionar filas en un QTableWidget.


He estado intentando eliminar la selección de una tabla QTableWidget, y la verdad es que me he demorado más de lo común debido a la forma en que se hace con qt.

La forma que me ha resultado más sencilla es la siguiente:

- Obtenemos el rango seleccionado mediante la función selectedRanges() del QTableWidget.
- Vamos recorriendo el rango y llamando a la función setRangeSelected() pasandole cada uno de los elementos QTableWidgetSelectionRange y el parámetro false para quitar la selección.

Aquí dejo el código de ejemplo, está hecho en java con qtjambi

      List unselectRange = ui.tableWidgetUsers.selectedRanges();
      for(QTableWidgetSelectionRange range : unselectRange)
      {
        ui.tableWidgetUsers.setRangeSelected(range, false);
      }

viernes, 19 de agosto de 2011

Aplicando parches con diff.

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.

Supongamos que tenemos el siguiente código fuente:
fib1.c
#include 
#include 

/* Find the nth Fibonacci number. */
static int fib(int n)
{
  if (n <= 0)
    return 0;
  if (n == 1)
    return 1;
  return fib(n - 1) + fib(n - 2);
}

int main(int argc, char** argv)
{
  if (argc < 2) {
    fprintf(stderr, "Need an argument.\n");
    return 1;
  }

  printf("%d\n", fib(atoi(argv[1])));
  return 0;
}
Y hemos recibido el siguiente parche: fib-linear-time.patch
--- fib1.c 
+++ fib2.c 
@@ -4,11 +4,17 @@
 /* Find the nth Fibonacci number. */
 static int fib(int n)
 {
-  if (n <= 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 < n; i++) {
+    int next = current + prev;
+    prev = current;
+    current = next;
+  }
+
+  return current;
 }
 
 int main(int argc, char** argv)
Para aplicar el parche simplemente debemos ejecutar la siguiente orden desde consola:
patch < fib-linear-time.patch
Y con esto nuestro archivo fib1.c quedaría de la forma siguiente: fib1.c
#include 
#include 

/* Find the nth Fibonacci number. */
static int fib(int n)
{
  int prev = 1;
  int current = 0;
  int i;

  for (i = 0; i < n; i++) {
    int next = current + prev;
    prev = current;
    current = next;
  }

  return current;
}

int main(int argc, char** argv)
{
  if (argc < 2) {
    fprintf(stderr, "Need an argument.\n");
    return 1;
  }

  printf("%d\n", fib(atoi(argv[1])));
  return 0;
}




QString to const char*. Convetir QString a const char*

Cuando empezamos a programar en qt es común que no sepamos convertir converir un QString en char*.
Una forma rápida y sencilla de convertir un QString en un const char* es la siguiente.

String str("hello");
const char* ch = str.toLocal8Bit().constData();

lunes, 15 de agosto de 2011

Usar qDebug con QString

Últimamente he estado teniendo problemas al usar la función qDebug y pasarle un QString como parámetro.

"no matching function for call to 'qDegug(Qstring&)"

El problema, como podemos ver, es que no hay ninguna función qDebug que acepte un QString como parámetro.

La solución es usar el operador << para indicarle que QString queremos imprimir. Sería algo así:

QString text("hello qt");
qDegug() << text;