Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Qt. No me funciona prepend

Estas en el tema de Qt. No me funciona prepend en el foro de C/C++ en Foros del Web. Hola: A la carga de nuevo con Qt. Resulta que me estoy creando un modelo para los datos, y quería hacer lo siguiente: Cuando defino ...
  #1 (permalink)  
Antiguo 01/12/2014, 14:04
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Qt. No me funciona prepend

Hola:

A la carga de nuevo con Qt.
Resulta que me estoy creando un modelo para los datos, y quería hacer lo siguiente:
Cuando defino la función headerData, quiero añadir a los datos de cabecera unas leyendas. No quiero que haya un encabezamiento en la fila 0, sino añadir a los elementos de la fila 0 unas leyendas.

Entonces en la propia clase del modelo tengo tantas leyendas como columnas va a tener la tabla. Estas leyendas están definidas en un array:
Código C++:
Ver original
  1. QString LeyendasCabecera[11];

Luego en la citada función headerData hago lo siguiente para añadir esas leyendas:
Código C++:
Ver original
  1. .................
  2. for(int i=0; i<datos.at(0).length(); i++)
  3.                 {
  4. datos.value(0).value(i)=datos.value(0).value(i).prepend(LeyendasCabecera[i]);
  5.                    
  6.                 }
  7. ............

Es una cosa trivial, pero no doy con la tecla
Ayuda por favor
__________________
Mi calculadora en Qt
  #2 (permalink)  
Antiguo 01/12/2014, 15:17
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt. No me funciona prepend

por poner leyenda te refieres a un tooltip?
  #3 (permalink)  
Antiguo 02/12/2014, 04:03
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Qt. No me funciona prepend

Hola eferion:

No era eso. Me explico un poco:
La tabla ha de mostrar el contenido de un grafo.
La cabecera ha de mostrar los campos del nodo padre, y las filas los campos de los nodos hijos que hubiere.

Entonces, lo que quería hacer era añadir una leyenda a cada campo del encabezamiento.
Dicho esto, no sé por qué, pero he tenido que solucionarlo así:
Código C++:
Ver original
  1. for(int i=0; i<datos.at(0).length(); i++)
  2.     {
  3.         QString aux=datos.value(0).value(i).prepend(LeyendasCabecera[i]);
  4.         datos[0][i]=aux;       
  5.     }

Saludos y gracias!
__________________
Mi calculadora en Qt
  #4 (permalink)  
Antiguo 02/12/2014, 04:26
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt. No me funciona prepend

la firma de la función prepend:

Código C++:
Ver original
  1. QString & QString::prepend ( const QString & str )

Es decir, prepend modifica el string actual y devuelve una referencia de la instancia actual.

Con tu código original:

Código C++:
Ver original
  1. datos.value(0).value(i)=datos.value(0).value(i).prepend(LeyendasCabecera[i]);

Si lo simplificamos un poco:

Código C++:
Ver original
  1. str=str.prepend(LeyendasCabecera[i]);

Resulta que estás haciendo esto:

Código C++:
Ver original
  1. str.prepend(LeyendasCabecera[i]);
  2. str = str;

Y esa última asignación no es algo especialmente recomendable en C++.

Dicho esto, tal y como dicta la firma que te he puesto al inicio de la función, es posible que tu código funcione simplemente con esto:

Código C++:
Ver original
  1. datos.value(0).value(i).prepend(LeyendasCabecera[i]);

Si no funciona es porque value(0) o value(i) está devolviendo un string por valor en vez de por referencia. No puedo decir más porque ignoro la estructura de "datos".

Un saludo.
  #5 (permalink)  
Antiguo 02/12/2014, 04:50
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Qt. No me funciona prepend

Hola eferion:

Esta forma
Código C++:
Ver original
  1. datos.value(0).value(i).prepend(LeyendasCabecera[i]);
es la primera que puse.

Veamos:

datos es una lista de QStringList, y es un miembro de la clase:
Código C++:
Ver original
  1. QList <QStringList> datos;

Y la función que suministra los datos a dicha estructura está implementada en otra clase:
Código C++:
Ver original
  1. void VolcarActual(QList<QStringList>& Listado)

La cual rellena el contenido del QList<QStringList> así:
Código C++:
Ver original
  1. O->VolcarActual(datos);
Y ahora, debería "prepender" a los elementos de la fila 0 las leyendas:
Código C++:
Ver original
  1. for(int i=0; i<datos.at(0).length(); i++)
  2.     {
  3.         //QString aux=datos.value(0).value(i).prepend(LeyendasCabecera[i]);
  4.         //datos[0][i]=aux; 
  5.         datos.value(0).value(i).prepend(LeyendasCabecera[i]);  
  6.     }

Y no sé por qué, no funciona como dices (y como debería de ser).
Saludos y gracias!
__________________
Mi calculadora en Qt
  #6 (permalink)  
Antiguo 02/12/2014, 05:12
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt. No me funciona prepend

Cita:
Iniciado por dehm Ver Mensaje
Y no sé por qué, no funciona como dices (y como debería de ser).
Firma de una función que usas:

Código C++:
Ver original
  1. T QList::value ( int i ) const

Fíjate que devuelve por valor, no por referencia. Ahí está haciendo una copia.

Si en vez de "value" usas el operador de indización "[]" o "at" no tendrás ese problema.

EDITO: PD.: Fíjate que QStringList hereda de QList ;)

Un saludo
  #7 (permalink)  
Antiguo 02/12/2014, 05:19
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Qt. No me funciona prepend

Ohhh...qué bruto soy!

Gracias eferion, ya funciona
__________________
Mi calculadora en Qt
  #8 (permalink)  
Antiguo 02/12/2014, 05:20
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt. No me funciona prepend

Son cosas que pasan.... este tipo de problemas se producen hasta en las mejores familias... no es nada fácil estar pendiente de todo a la vez :)

Un saludo.

Etiquetas: clase
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:34.