2010-01-05 7 views
6

Tengo una aplicación PyQt4 simple (ver el código a continuación) que revela el siguiente problema: si selecciono el texto de QLineEdit y lo copio en el portapapeles, entonces puedo pegarlo en otra aplicación solo mientras mi aplicación se está ejecutando. Parece que al salir, la aplicación PyQt borra el portapapeles, por lo que no puedo pegar el texto después de que se cierre la aplicación.¿Cómo puedo desactivar la eliminación del portapapeles al salir de la aplicación PyQt4?

¿Qué puedo hacer para evitar este problema?

PyQt 4.4.3 @ Python 2.5 @ Windows XP. También este efecto se confirmó en PyQt 4.5+, y en Linux también.

import sys 
from PyQt4 import QtGui 
app = QtGui.QApplication(sys.argv) 
edit = QtGui.QLineEdit() 
edit.setText('foo bar') 
edit.show() 
app.exec_() 
+0

Las selecciones PRIMARIO y SECUNDARIO no sobreviven después de que los programas que fueron seleccionados salgan en X. – jfs

Respuesta

5

OK, no hay nada de portapapeles. Simplemente QT almacena algún tipo de puntero de texto en el portapapeles en lugar de solo texto. Gordon Tyler me ha señalado esta discusión: http://old.nabble.com/Re:-Searching-for-a-very-small-scprit-using-CLIPBOARD-p23246491.html que explica lo que está sucediendo. Cito código y parte relevante de la explicación.

Ejecutar este código en la salida de la aplicación (por ejemplo, en manejador CloseEvent):

from PyQt4 import QtGui, QtCore 
    clipboard = QtGui.QApplication.clipboard() 
    event = QtCore.QEvent(QtCore.QEvent.Clipboard) 
    QtGui.QApplication.sendEvent(clipboard, event) 

El concepto básico detrás de esto es que mediante la copia por defecto algo en el portapapeles sólo copia una referencia/puntero a la fuente aplicación. Luego, cuando otra aplicación desea pegar los datos del portapapeles, solicita los datos de la aplicación de origen. Llamar a OleFlushClipboard hace que Windows copie los datos reales en el portapapeles en lugar de la referencia. Si bien esto causa un retraso de al copiar imágenes, no debería tener ningún impacto notable con cadenas.

El código anterior es bastante multiplataforma y no tiene ningún impacto negativo en la plataforma Linux.

1

Me encontré con esta pregunta cuando me encontré con un problema similar en GNU/Linux y encontré la respuesta en el sitio referenciado por bialix (cuya dirección ha cambiado, pero todavía se puede llegar a través de la búsqueda web). Para citar la parte más relevante:

Recuerde que en Linux, a menos que tenga algo así como Klipper, al configurar la aplicación de las salidas del portapapeles, portapapeles vacía.

Eso es todo. Es algo del sistema para GNU/Linux. Aquí hay una explicación más detallada de ubuntu wiki:

¿Por qué sucede esto?

El problema ocurre porque Xorg adopta un enfoque conservador para la copia. Copia solo una referencia a los datos originales cuando el usuario realiza una selección o copia. No va y recupera los datos reales del programa fuente hasta que el usuario solicite un pegado. Se ahorra una gran cantidad de transferencia innecesaria de datos de esta manera, a expensas de no tener forma de recuperar datos de un programa cerrado que no ha guardado su portapapeles en otro lugar.

Puede solucionarlo instalando un administrador de portapapeles como parcellite, klipper, glipper o clipman.

Cuestiones relacionadas