Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在PyQt应用程序退出时禁用清除剪贴板?_Python_Qt_Pyqt_Clipboard - Fatal编程技术网

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

Python 如何在PyQt应用程序退出时禁用清除剪贴板?,python,qt,pyqt,clipboard,Python,Qt,Pyqt,Clipboard,我有一个简单的PyQt4应用程序(见下面的代码),它揭示了一个问题:如果我从QLineEdit中选择文本并将其复制到剪贴板,那么我只能在应用程序运行时将其粘贴到另一个应用程序。似乎在退出时,PyQt应用程序会清除剪贴板,因此在应用程序关闭后无法粘贴文本 我能做些什么来避免这个问题 PyQt 4.4.3@python2.5@windowsxp。在PyQt 4.5+和Linux上也证实了这种效果 import sys from PyQt4 import QtGui app = QtGui.QAppl

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

我能做些什么来避免这个问题

PyQt 4.4.3@python2.5@windowsxp。在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_()

好的,没有完全清除剪贴板。只需在剪贴板中存储某种文本指针,而不仅仅是文本。戈登·泰勒向我指出了发生的一切。我引用代码和相关部分的解释

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

这背后的基本概念是默认情况下复制某些内容 在剪贴板中只复制指向源的引用/指针 应用然后当另一个应用程序想要粘贴数据时 它从剪贴板请求源应用程序的数据。 调用会导致Windows复制真实数据 进入剪贴板而不是引用。而这确实会导致 复制图像时延迟,不应产生任何明显影响 用绳子


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

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

请记住,在Linux中,除非您有类似klipper的东西,否则当设置剪贴板的应用程序退出时,剪贴板将清空

就是这样。它是GNU/Linux的系统。下面是一个更全面的解释:

为什么会发生这种情况

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


您可以通过安装剪贴板管理器(如parcellite、klipper、glipper或clipman)来解决此问题。

主选项和辅助选项在X上退出时选择的程序之后将无法继续存在。如果没有可用的剪贴板管理器,则此操作在其他平台上不起作用。
   from PyQt4 import QtGui, QtCore
   clipboard = QtGui.QApplication.clipboard()
   event = QtCore.QEvent(QtCore.QEvent.Clipboard)
   QtGui.QApplication.sendEvent(clipboard, event)