¿Cómo puedo desactivar la limpieza del portapapeles al salir de la aplicación PyQt?

Tengo una aplicación PyQt4 simple (ver el código a continuación) que revela un problema: si selecciono el texto de un QLineEdit y lo copio en el portapapeles, entonces puedo pegarlo en otra aplicación solo mientras mi aplicación está ejecutándose. Parece que al salir, la aplicación PyQt borra el portapapeles, por lo que no puedo pegar el texto después de cerrar la aplicación.

¿Qué puedo hacer para evitar este problema?

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

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

OK, no está exactamente claro de lo que ocurre el portapapeles. Solo 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 en la lista de correo de PyQt que explica lo que está pasando. Cito el código y parte relevante de la explicación.

Ejecute este código al salir de la aplicación (por ejemplo, en el controlador 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, de forma predeterminada, al copiar algo en el portapapeles solo se copia una referencia / puntero a la aplicación de origen. Luego, cuando otra aplicación quiere pegar los datos del portapapeles, solicita los datos de la aplicación de origen. Al llamar a OleFlushClipboard , Windows copia los datos reales en el portapapeles en lugar de la referencia. Si bien esto causa un retraso al copiar imágenes, no debería tener ningún impacto notable con las cadenas.

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

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

Recuerde que en Linux, a menos que tenga algo como klipper, cuando la aplicación que configura el portapapeles sale, el portapapeles se vacía.

Así que ahí está eso. Es una cosa del sistema para GNU / Linux. Aquí hay una explicación más completa de ubuntu wiki :

¿Por qué pasó esto?

El problema ocurre porque Xorg adopta un enfoque conservador para copiar. Copia solo una referencia a los datos originales cuando el usuario realiza una selección o copia. No va a recuperar los datos reales del progtwig fuente hasta que el usuario solicite un pegado. De esta forma, se ahorra una gran cantidad de transferencias de datos innecesarias, a costa de no tener forma de recuperar datos de un progtwig cerrado que no haya guardado su portapapeles en otro lugar.

Puede evitarlo instalando un gestor de portapapeles como parcellite, klipper, glipper o clipman.