La imagen copiada al portapapeles no persiste en Linux

Estoy tratando de guardar una imagen en el portapapeles del sistema, así que escribí un código como este:

#!/usr/bin/python3 from PyQt5.Qt import QApplication from PyQt5.QtWidgets import QWidget, QPushButton from PyQt5.Qt import QImage import sys class MyWidget(QWidget): def __init__(self): super(MyWidget, self).__init__() self.button = QPushButton(self) self.button.clicked.connect(self.copyPicToClip) def copyPicToClip(self): image = QImage('./test.jpg') QApplication.clipboard().setImage(image) self.close() if __name__ == '__main__': a = QApplication(sys.argv) myW = MyWidget() myW.show() a.exec() 

Lamentablemente, encontré que no funciona en absoluto. Entonces traté de encontrar una solución. Lo primero que probé fue esto:

 def copyPicToClip(self): image = QImage('./test.jpg') QApplication.clipboard().setImage(image) # self.close() 

Después de esto, acabo de encontrar que funcionó, pero la ventana no se cierra automáticamente.

Entonces intenté con copiar texto:

 #!/usr/bin/python3 from PyQt5.Qt import QApplication, QClipboard from PyQt5.QtWidgets import QWidget, QPushButton from PyQt5.Qt import QImage import sys class MyWidget(QWidget): def __init__(self): super(MyWidget, self).__init__() self.button = QPushButton(self) self.button.clicked.connect(self.copyPicToClip) QApplication.clipboard().dataChanged.connect(self.testFunc) def copyPicToClip(self): image = QImage('./test.jpg') QApplication.clipboard().setImage(image) def testFunc(self): print('Here') self.close() if __name__ == '__main__': a = QApplication(sys.argv) myW = MyWidget() myW.show() a.exec() 

Lamentablemente, volvió a fallar.

    Por lo tanto, parece que si cierro la aplicación antes de tiempo, la imagen no se guardará en el portapapeles. Pero quiero cerrarlo después de copiar la imagen en el portapapeles.

    ¿Alguna sugerencia?

    (PyQt5, ubuntu 16.10, si ayuda).

    Desafortunadamente para usted, este es el comportamiento “normal” en Linux. De forma predeterminada, los datos del portapapeles no se conservan cuando una aplicación se cierra. La solución habitual para este problema es instalar un administrador de portapapeles. Para Ubuntu, vea este artículo de wiki para más detalles:

    • Ubuntu Wiki: Persistencia Del Portapapeles

    (NB: no he probado ninguna de las soluciones sugeridas, así que no sé si alguna de ellas funcionará con PyQt).

    El problema básico es que en Linux, el portapapeles solo almacena una referencia a los datos subyacentes. Esto es muy eficiente en términos de almacenamiento, porque los datos solo se copian cuando el progtwig del cliente realmente los solicita. Pero, por supuesto, si la aplicación de origen se cierra, la referencia se invalidará y el portapapeles quedará vacío.