Problema con Qt y el manejo del portapapeles

Rachmaninov

Lanero Reconocido
21 Mar 2007
1,101
Reciban un cordial saludo,

Estoy desarrollando un micro-aplicativo, simple pero útil, escrito en C++ con licencia GPL que deberá cumplir la funcionalidad de transformar un archivo ODT (archivo de texto ODF) en un formato HTML, limpio, sin CSS, sin espacios innecesarios, con el propósito de ser fácilmente copiado a un blog quedando lo más fiel posible a lo realizado en el archivo ODT. Actualmente no es simple obtener un texto con formato listo para pegar en un blog que no esté editado directamente en HTML, una solución que viene inmediatamente a la cabeza es una debida exportación desde el OpenOffice, pero OpenOffice genera un HTML con CSS y esto es un problema para este tipo de copia, KWork por ejemplo si permite un HTML sin CSS limpio, pero aún así es necesario limpiar el documento de saltos de líneas adicionales. Este aplicativo pretende hacer la copia al vuelo conservando los atributos de formato comunmente permitidos en blogs: fuentes negritas, cursiva y subrayado; tablas, encabezados (headers), párrafos,... Una idea complementaria al desarrollo, es adaptar este aplicativo a una acción del explorador de archivos, por ejemplo Nautilus, y que al darle click derecho al archivo aparezca una opción "Copiar para blog...", esto ya es posible gracias al paquete "nautilus-actions"; dada la configurabilidad de KDE, esto debe ser posible sin instalaciones adicionales como en Gnome.

Vaya sorpresa que haciendo un aplicativo tan simple que esperaba terminar en 2/4 horas de pan y gaseosa frente al computador, encontré pequeños problemas bien galletudos y otros no galletudos pero tengo mis dudas de qué forma hacerlo mejor. A continuación comento y de antemano agradezco cualquier colaboración:

El portapapeles

Lo más ágil es dejar el contenido convertido en el portapapeles para permitir copiarlo de inmediato en el browser, para el propósito estoy empleando QClipboard, pero vaya sorpresa la que me llevé cuando no me funcionaban los accesos al portapapeles para escritura, y después de horas probando me encontré con esta parte de la documentación:

Lastly, the X11 clipboard is event driven, i.e. the clipboard will not function properly if the event loop is not running. Similarly, it is recommended that the contents of the clipboard are stored or retrieved in direct response to user-input events, e.g. mouse button or key presses and releases. You should not store or retrieve the clipboard contents in response to timer or non-user-input events.

Fuente: http://doc.trolltech.com/4.3/qclipboard.html

Como la copia del portapapeles no se produce en respuesta a un evento gráfico, ni el aplicativo tiene un loop de eventos, X11, más que el mismo Qt, parece tener esa limitación :( ... ¿Qué me recomiendan hacer?.

Gestión de archivos ZIP

El archivo ODT es básicamente un archivo comprimido con formato ZIP, para el funcionamiento del software es por lo tanto encesario obtener el contenido del archivo "content.xml" dentro del archivo ZIP representado en un ODT. ¿Qué librería, lo más estandar posible, me recomendarían para manejar archivos ZIP?.

PD: anexo código fuente del mini-proyecto, por si alguien quiere dar una sugerencia adicional. Si tienen instalado los paquetes básicos de compilación C++ y Qt, solo es dar un "make", ya están generados los archivos de proyecto y Makefile necesarios.
 

Archivos adjuntos

  • odt_html.zip
    24.8 KB · Visitas: 111
Reciban un cordial saludo,

Estoy desarrollando un micro-aplicativo, simple pero útil, escrito en C++ con licencia GPL que deberá cumplir la funcionalidad de transformar un archivo ODT (archivo de texto ODF) en un formato HTML, limpio, sin CSS, sin espacios innecesarios, con el propósito de ser fácilmente copiado a un blog quedando lo más fiel posible a lo realizado en el archivo ODT. Actualmente no es simple obtener un texto con formato listo para pegar en un blog que no esté editado directamente en HTML, una solución que viene inmediatamente a la cabeza es una debida exportación desde el OpenOffice, pero OpenOffice genera un HTML con CSS y esto es un problema para este tipo de copia, KWork por ejemplo si permite un HTML sin CSS limpio, pero aún así es necesario limpiar el documento de saltos de líneas adicionales. Este aplicativo pretende hacer la copia al vuelo conservando los atributos de formato comunmente permitidos en blogs: fuentes negritas, cursiva y subrayado; tablas, encabezados (headers), párrafos,... Una idea complementaria al desarrollo, es adaptar este aplicativo a una acción del explorador de archivos, por ejemplo Nautilus, y que al darle click derecho al archivo aparezca una opción "Copiar para blog...", esto ya es posible gracias al paquete "nautilus-actions"; dada la configurabilidad de KDE, esto debe ser posible sin instalaciones adicionales como en Gnome.

Vaya sorpresa que haciendo un aplicativo tan simple que esperaba terminar en 2/4 horas de pan y gaseosa frente al computador, encontré pequeños problemas bien galletudos y otros no galletudos pero tengo mis dudas de qué forma hacerlo mejor. A continuación comento y de antemano agradezco cualquier colaboración:

El portapapeles

Lo más ágil es dejar el contenido convertido en el portapapeles para permitir copiarlo de inmediato en el browser, para el propósito estoy empleando QClipboard, pero vaya sorpresa la que me llevé cuando no me funcionaban los accesos al portapapeles para escritura, y después de horas probando me encontré con esta parte de la documentación:

Lastly, the X11 clipboard is event driven, i.e. the clipboard will not function properly if the event loop is not running. Similarly, it is recommended that the contents of the clipboard are stored or retrieved in direct response to user-input events, e.g. mouse button or key presses and releases. You should not store or retrieve the clipboard contents in response to timer or non-user-input events.

Fuente: http://doc.trolltech.com/4.3/qclipboard.html

Como la copia del portapapeles no se produce en respuesta a un evento gráfico, ni el aplicativo tiene un loop de eventos, X11, más que el mismo Qt, parece tener esa limitación :( ... ¿Qué me recomiendan hacer?.
Parece una limitacion de X11, sus razones debe tener... Estuve pensando un rato y se me ocurrio un hack q parece funcionar, te envio el codigo, tambien puedes mostrar el texto generado en la salida estandard

Gestión de archivos ZIP

El archivo ODT es básicamente un archivo comprimido con formato ZIP, para el funcionamiento del software es por lo tanto encesario obtener el contenido del archivo "content.xml" dentro del archivo ZIP representado en un ODT. ¿Qué librería, lo más estandar posible, me recomendarían para manejar archivos ZIP?.

PD: anexo código fuente del mini-proyecto, por si alguien quiere dar una sugerencia adicional. Si tienen instalado los paquetes básicos de compilación C++ y Qt, solo es dar un "make", ya están generados los archivos de proyecto y Makefile necesarios.

puedes usar ZLib, hay algunos proyectos como Quazip que hacen un interfaz a Qt, la pagina es:
http://quazip.sourceforge.net/

saludos


PD: grrr este foro no acepta .tar.... q peste, renombra el archivo adjunto a .tar.bz2
 

Archivos adjuntos

  • clipboard.zip
    2.3 KB · Visitas: 115
Gracias por el dato de la librería para gestión de archivos ZIP, en la búsqueda de una API para el propósito no me topé con ella antes.

Integré el código del hack que me mandaste pero no tuve éxitos en las pruebas, confirmé que el código HTML se generara, hasta mostré un QMessageBox para confirmar, funcionaron bien los timers, pero no quedó nada en el portapapeles. Información así relevante es que lo probé en sistema operativo Ubuntu 7.10 con Gnome, depronto probaste el hack con un escritorio diferente (KDE lo más probable). Además probé con tu proyecto clipboard y tampoco funcionó.

Creo que la solución va a ser mostrar un TextView con el HTML generado y ponerle un botón copiar; algo desde luego mucho menos ágil que la solución que se pretendía inicialmente.

Anexo la versión del proyecto integrada con el hack,

Gracias nuevamente.
 

Archivos adjuntos

  • odt_html_qt.zip
    33.7 KB · Visitas: 147
En application.h hay un funcion llamada close(), intenta aumentar el parametro por defecto de 100 a 1000
 

Los últimos temas