bia*_*lix 7 python clipboard qt pyqt
我有一个简单的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_()
Run Code Online (Sandbox Code Playgroud)
好的,没有完全清楚的剪贴板发生.只是QT在剪贴板中存储某种文本指针而不仅仅是文本.Gordon Tyler向我指出了这个讨论:http://old.nabble.com/Re: -Searching-for-a-very-small-scprit-using-CLIPBOARD-p23246491.html它解释了发生了什么.我引用代码和相关部分的解释.
在退出应用程序时运行此代码(例如在closeEvent处理程序中):
from PyQt4 import QtGui, QtCore
clipboard = QtGui.QApplication.clipboard()
event = QtCore.QEvent(QtCore.QEvent.Clipboard)
QtGui.QApplication.sendEvent(clipboard, event)
Run Code Online (Sandbox Code Playgroud)
这背后的基本概念是,默认情况下,将某些内容复制到剪贴板中只会复制指向源应用程序的引用/指针.然后,当另一个应用程序想要从剪贴板粘贴数据时,它会从源应用程序请求数据.调用OleFlushClipboard会导致Windows将实际数据复制到剪贴板而不是引用.虽然这确实会在复制图像时造成延迟,但它不会对字符串产生任何明显的影响.
上面的代码非常跨平台,不会对Linux平台产生任何不良影响.