复制到剪贴板的图像不会在Linux

时间:2016-12-03 05:41:21

标签: python pyqt clipboard pyqt5 qimage

我试图将图像保存到系统剪贴板,所以我写了一些这样的代码:

#!/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()
可悲的是,我发现它根本不起作用。然后我试着找到一个解决方案。我尝试的第一件事是:

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

在此之后,我发现它有效,但窗口没有自动关闭。

然后我尝试复制文字:

#!/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()

可悲的是,它又失败了。

所以,似乎如果我提前关闭应用程序,图像就不会保存到剪贴板中。但我希望在将图像复制到剪贴板后关闭它。

有什么建议吗?

(PyQt5,ubuntu 16.10,如果有帮助的话)。

1 个答案:

答案 0 :(得分:1)

不幸的是,这是"正常" Linux上的行为。默认情况下,应用程序关闭时不会保留剪贴板数据。解决此问题的常见方法是安装剪贴板管理器。对于Ubuntu,请参阅此Wiki文章以获取更多详细信息:

(注意:我自己实际上没有测试任何建议的解决方案,因此我不知道它们中的任何一个是否可以与PyQt一起使用)。

基本问题是在Linux上,剪贴板只存储对底层数据的引用。这在存储方面非常有效,因为仅在客户端程序实际请求时才复制数据。但是当然如果源应用程序关闭,引用将失效,剪贴板将变为空。