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

Posted

技术标签:

【中文标题】如何在 PyQt 应用程序退出时禁用清除剪贴板?【英文标题】:How can I disable clear of clipboard on exit of PyQt application? 【发布时间】:2010-01-05 15:43:39 【问题描述】:

我有一个简单的 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_()

【问题讨论】:

PRIMARY 和 SECONDARY 选择在 X 上退出时选择它们的程序后不再存在。 【参考方案1】:

好的,没有完全清除剪贴板发生。只是 QT 在剪贴板中存储某种文本指针,而不仅仅是文本。 Gordon Tyler 已将我指向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)来绕过它。

【讨论】:

以上是关于如何在 PyQt 应用程序退出时禁用清除剪贴板?的主要内容,如果未能解决你的问题,请参考以下文章

系统资源不够,无法完成API怎么办?

VB如何利用剪贴板复制、粘贴文件,用到啥API

如何禁用vim粘贴到/从系统剪贴板?

IOS剪贴板(复制粘贴)不能跨应用程序

在应用程序退出时清除数据

如何在 PyQt5 中捕获 QTableWidget 上的左右鼠标单击事件?