首页 > 解决方案 > 如何防止 PyQt 应用程序在退出时清除剪贴板?

问题描述

我正在编写一个包含一些文本小部件的 PyQt5 应用程序。如果我将一些文本复制到剪贴板,我只能在我的程序运行时将其粘贴到其他程序中。如果我关闭我的程序,它的剪贴板数据就会消失。

我看到有一个关于此的开放 Qt 错误,它建议调用 Windows API OleFlushClipboard,但我正在寻找一个跨平台的解决方案。

我的问题与这个问题基本相同,但那里的答案已有 10 多年的历史了,它似乎不再起作用了。我将该代码放在我的程序中的不同位置(在 closeEvent 处理程序中,在我手动调用的另一个函数中只是为了测试它等),它不会刷新剪贴板。

我的测试代码与旧问题的代码基本相同,但针对 PyQt5 进行了更新:

import sys
import random

from PyQt5 import QtGui, QtWidgets, QtCore
print("Qt Version", QtCore.QT_VERSION_STR)
print("PyQt Version", QtCore.PYQT_VERSION_STR)
app = QtWidgets.QApplication(sys.argv)
edit = QtWidgets.QLineEdit()
edit.setText('try copying this random number {}'.format(random.randint(1, 1000)))
edit.show()
app.exec_()

如果我运行它并从 QLineEdit 复制文本,然后关闭应用程序,我无法将数据粘贴到任何地方;没了。如果我运行它,复制文本,将其粘贴到另一个应用程序中(在关闭我的 PyQt5 测试程序之前),然后关闭我的测试程序,我会出现奇怪且不一致的行为,我可以粘贴到某些应用程序中,但不能粘贴到其他应用程序中。似乎我通常可以在关闭测试程序之前继续粘贴到我粘贴到的任何应用程序中,但是粘贴到其他应用程序时会遇到问题。但最重要的是,无论我何时关闭与粘贴相关的 Qt 程序,并且 Qt 无法使其正常工作,我都希望粘贴始终适用于任何应用程序。

是否有任何跨平台方法可以强制 Qt 停止存储指向剪贴板数据的“指针”并立即将实际复制的数据放入实际的系统剪贴板?我宁愿不依赖诸如 closeEvent 之类的东西,而是完全禁用 Qt 正在做的任何花哨的事情,并让它总是在每个剪贴板事件上立即将实际数据直接放入系统剪贴板,而无需维护任何类型的控制或指针处理(所以即使我强行杀死了我的 Qt 应用程序并且它没有“清理”并在退出时刷新剪贴板,数据仍然会在剪贴板上)。我正在 Windows 上对此进行测试,但我想要一个至少适用于 Windows、Mac 和 Linux 的解决方案。

标签: pythonqtpyqtpyqt5clipboard

解决方案


推荐阅读