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

问题描述 投票:7回答:2

我有一个简单的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_()
python qt pyqt clipboard
2个回答
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平台产生任何不良影响。


2
投票

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

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

就是这样。这是GNU / Linux的一个系统。以下是来自ubuntu wiki的更全面的解释:

为什么会这样?

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

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

© www.soinside.com 2019 - 2024. All rights reserved.