2016-12-03 214 views
1

我试图将图像保存到系统剪贴板不工作,所以我写了一些像这样的代码:复制到系统剪贴板中的图像上的Linux

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

不幸的是你,这是在Linux上“正常”的行为。默认情况下,剪贴板数据在应用程序关闭时不会持久。解决此问题的通常解决方法是安装剪贴板管理器。对于Ubuntu的,详细信息请参阅该wiki文章:

(注:我没有实际测试过的任何建议的解决方案我自己,所以我不知道是否有任何他们将与PyQt合作)。

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