如何在退出PyQt应用程序时禁用清除剪贴板?

时间:2010-01-05 15:43:40

标签: python qt pyqt clipboard

我有一个简单的PyQt4应用程序(请参阅下面的代码),它显示了一个问题:如果我从QLineEdit中选择文本并将其复制到剪贴板,那么我只能将其粘贴到另一个应用程序中应用程序正在运行似乎在退出时,PyQt应用程序清除了剪贴板,因此我无法在应用程序关闭后粘贴文本。

我该怎么做才能避免这个问题?

PyQt 4.4.3 @ Python 2.5 @ Windows XP。此效果也在PyQt 4.5+和Linux上得到证实。

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

2 个答案:

答案 0 :(得分:5)

好的,没有完全清楚的剪贴板发生。只是QT在剪贴板中存储某种文本指针而不仅仅是文本。戈登泰勒指着我this discussion on the PyQt mailing list解释了发生了什么。我引用代码和相关部分的解释。

在退出应用程序时运行此代码(例如在closeEvent处理程序中):

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

这背后的基本概念是默认复制某些东西   进入剪贴板只复制一个引用/指向源的指针   应用。然后当另一个应用程序想要粘贴数据时   从剪贴板中,它从源应用程序请求数据。   调用OleFlushClipboard会导致Windows复制真实数据   进入剪贴板而不是引用。虽然这确实导致了   复制图像时延迟,不应有任何明显的影响   用字符串。

上面的代码非常跨平台,不会对Linux平台产生任何不良影响。

答案 1 :(得分:2)

当我遇到GNU / Linux下的类似问题时,我偶然发现了这个问题,并在bialix引用的网站上找到答案(其地址已更改,但仍可通过网络搜索获得)。引用最相关的部分:

  

请记住,在Linux中,除非你有像klipper这样的东西,当设置剪贴板的应用程序退出时,剪贴板会清空。

所以那就是。它是GNU / Linux的系统之物。以下是ubuntu wiki的更全面的解释:

  

为什么会这样?

     

问题出现是因为Xorg采用保守的方法进行复制。当用户执行选择或复制时,它仅复制对原始数据的引用。在用户请求粘贴之前,它不会从源程序中检索实际数据。它以这种方式节省了大量不必要的数据传输,代价是无法从未在其他地方保存剪贴板的已关闭程序中检索数据。

你可以通过安装剪贴板管理器来解决这个问题,例如parcellite,klipper,glipper或clipman。