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

Qt. Implementar copiar y pegar

Estas en el tema de Qt. Implementar copiar y pegar en el foro de C/C++ en Foros del Web. Hola: Estoy viendo cosas de Qt, y tengo una duda respecto al portapapeles. Veo que para información estandar, hay métodos implementados en la clase QClipboard ...
  #1 (permalink)  
Antiguo 13/11/2014, 10:55
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Qt. Implementar copiar y pegar

Hola:

Estoy viendo cosas de Qt, y tengo una duda respecto al portapapeles.
Veo que para información estandar, hay métodos implementados en la clase QClipboard para mandar la selección al portapapeles y para leer del mismo.

Pero ¿cómo se hace para tipos más complejos?
Por ejemplo, si tengo una estructura típica de nombre-apellidos-DNI y en una tabla, y quiero copiar varios de ellos...como sería?

La verdad es que la pregunta la he formulado en plan "hoygan" total, pero es que siempre que veo ejemplo no veo lo que pregunto.
Saludos y gracias!
  #2 (permalink)  
Antiguo 13/11/2014, 11:15
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años
Puntos: 204
Respuesta: Qt. Implementar copiar y pegar

El portapapeles no es un ente abstracto donde todo tenga cabida de cualquier forma. Para guardar una estructura tienes que "preparar" el contenido de la estructura de alguna forma que te permita luego recuperar los valores.

En el caso de texto, una opción puede ser usar un separador:

Código C++:
Ver original
  1. void copiar( )
  2. {
  3.   QClipboard *clipboard = QApplication::clipboard( );
  4.   QString alPortapapeles = nombre + "\t" + apellidos + "\t" + QString::number( dni );
  5.   clipboard->setText( alPortapapeles );
  6. }
  7.  
  8. void pegar( )
  9. {
  10.   const QClipboard *clipboard = QApplication::clipboard( );
  11.   const QMimeData *mimeData = clipboard->mimeData( );
  12.  
  13.   if ( mimeData->hasText( ) )
  14.   {
  15.     QString delPortapapeles = clipboard->text( );
  16.     QStringList listado = delPortapapeles.split( '\t' );
  17.     nombre = listado.at( 0 );
  18.     apellidos = listado.at( 1 );
  19.     dni = listado.at( 2 ).toInt( );
  20.   }
  21. }
  #3 (permalink)  
Antiguo 13/11/2014, 15:23
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Qt. Implementar copiar y pegar

Hola eferion, muchas gracias por estar ahí
(antes que nada he de decir que no he terminado de desmenuzar tu respuesta a mi otra duda, así que la tengo pendiente porque había cosas que no entendía.

Bueno, volviendo a esto.
entiendo que cuando haces
Código C++:
Ver original
  1. QClipboard *clipboard = QApplication::clipboard( );
en la función copiar y
Código C++:
Ver original
  1. const QClipboard *clipboard = QApplication::clipboard( );
estas declarando un puntero a una función global, y que estás apuntando a la misma función en ambos casos, no?
Y lo de declarar const el puntero en pegar() es para hacerlo de sólo lectura. ¿Es así?

Otra cosilla. Esto:
Código C++:
Ver original
  1. const QMimeData *mimeData = clipboard->mimeData( );
¿El objeto de declarar este puntero es para poder preguntar al portapapeles el tipo de información que almacena?

Y por último....si quiero guardar un dato binario, ¿como sería?
Imagina que esa estructura es el contenido de un nodo de un árbol (vamos, que realmente eso es lo que pretendo aunque el contenido tiene otras cosas). Ahora si quiero copiar un nodo con todas sus aristas y nodos que penden de él...lo que sería una rama, de un árbol a otro diferente....¿como sería?

Es más
  #4 (permalink)  
Antiguo 14/11/2014, 03:54
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Qt. Implementar copiar y pegar

Otra duda....estoy tratando de emular el comportamiento de un programa.
En este programa, cada elemento de la tabla es un nodo que tiene hijos asociados.
Cuando hago un copia/pega de un elemento de la tabla a otra instancia del programa, se copia todo. Es decir, me crea un elemento nuevo en la tabla (el nodo) y todos los hijos que este tenga.
Pero si el pegado lo hago por ejemplo a un editor de texto plano, solamente se pegan los datos correspondientes al contenido del registro en cuestión.

Entonces, ¿el copia/pega hay que implementarlo de diferentes formas en función del programa receptor?

(cuando empiece a decir más tonterías de la cuenta me lo decís)!
  #5 (permalink)  
Antiguo 14/11/2014, 04:21
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años
Puntos: 204
Respuesta: Qt. Implementar copiar y pegar

Cita:
Iniciado por dehm Ver Mensaje
Hola eferion, muchas gracias por estar ahí
estas declarando un puntero a una función global, y que estás apuntando a la misma función en ambos casos, no?
No es una función global. QApplication es una clase que tiene un método estático que devuelve un puntero a una clase que te permite acceder al contenido del portapapeles.

Dicho esto, sí, ambos punteros están apuntando a la misma clase, en un caso la intención es modificar el contenido del portapapeles y en la otra acceder a dicho contenido.

Cita:
Iniciado por dehm Ver Mensaje
Y lo de declarar const el puntero en pegar() es para hacerlo de sólo lectura. ¿Es así?
Exacto. Marcar los elementos que vas a utilizar de solo lectura como const permiten que el compilador pueda realizar determinadas optimizaciones sobre el código que de otra forma no podría realizar... ojo, que pueda hacerlas no quiere decir que las vaya a realizar, todo esto depende de varios factores.

Cita:
Iniciado por dehm Ver Mensaje
Otra cosilla. Esto:
Código C++:
Ver original
  1. const QMimeData *mimeData = clipboard->mimeData( );
¿El objeto de declarar este puntero es para poder preguntar al portapapeles el tipo de información que almacena?
Esto:
Código C++:
Ver original
  1. const QMimeData *mimeData = clipboard->mimeData( );
  2. if ( mimeData->hasText( ) )

Es equivalente a:
Código C++:
Ver original
  1. if ( clipboard->mimeData( )->hasText( ) )

Lo he puesto así por que creo que es un código más claro y legible. No te hace falta ir a la ayuda de Qt para ver de qué tipo es el puntero que devuelve "mimeData( )".

Y sí, la clase QMimeData que devuelve la clase QClipboard te permite conocer el tipo de contenido almacenado en el portapapeles.

Cita:
Iniciado por dehm Ver Mensaje
Y por último....si quiero guardar un dato binario, ¿como sería?
QClipboard tiene los siguientes métodos para almacenar contenido en el portapapeles:
  • void setImage ( const QImage & image, Mode mode = Clipboard )
  • void setMimeData ( QMimeData * src, Mode mode = Clipboard )
  • void setPixmap ( const QPixmap & pixmap, Mode mode = Clipboard )
  • void setText ( const QString & text, Mode mode = Clipboard )

Salvo que quieras copiar una imagen, en cuyo caso deberías usar setImage o setPixmap, en caso de almacenar datos binarios lo suyo sería hacerlo mediante setMimeData. Este mecanismo te permite, además, establecer el tipo MIME que identifica dicho contenido binario. Esto último permite que terceras aplicaciones puedan reutilizar el contenido que has copiado en el portapapeles.

Cita:
Iniciado por dehm Ver Mensaje
Imagina que esa estructura es el contenido de un nodo de un árbol (vamos, que realmente eso es lo que pretendo aunque el contenido tiene otras cosas). Ahora si quiero copiar un nodo con todas sus aristas y nodos que penden de él...lo que sería una rama, de un árbol a otro diferente....¿como sería?
No hay una forma estandarizada para hacerlo, al menos que yo conozca. Lo suyo es que prepares esa información en la forma que te de la gana pero cuidando el detalle de que luego tienes que permitir el proceso inverso, es decir, recuperar la información del portapapeles y convertirla en información útil para tu aplicación.

Cita:
Iniciado por dehm Ver Mensaje
Entonces, ¿el copia/pega hay que implementarlo de diferentes formas en función del programa receptor?
El programa en el que intentas "pegar" el contenido del portapapeles no sabe lo que se va a encontrar ahí... así que intenta interpretarlo de la mejor manera posible. En base a esto te puedes esperar varios comportamientos:
  • No se pega nada
  • Se pega parte de la información y ésta es correcta
  • Se pega parte de la información y esta es errónea (total o parcialmente)
  • Se pega toda la información y ésta es correcta
  • Se pega toda la información y ésta es errónea (total o parcialmente)

Para contenido estándar (texto plano, por ejemplo), no deberías tener ningún problema, pero en cuanto empiezas a personalizar el copiado se irá reduciendo el catálogo de aplicaciones que serán capaces de reutilizar tu contenido.
  #6 (permalink)  
Antiguo 14/11/2014, 04:37
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Qt. Implementar copiar y pegar

Gracias eferion. Con lo que me has aclarado creo que tengo para entretenerme un buen rato.
No cierro el tema como solucionado por si me surge algo, aunque ya tengo materia para empezar.
Saludos!

Etiquetas: clase, implementar, pegar
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 00:57.