Ver Mensaje Individual
  #5 (permalink)  
Antiguo 14/11/2014, 04:21
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
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.