我正在尝试截获特定编辑框的paste()。在读了很多书和挠头之后,我决定试试大锤子和猴子补丁。这对我也没用。有人知道为什么吗?在
import sys
from PyQt4 import QtGui
def myPaste():
print("paste") # Never gets here
if __name__ == "__main__":
# QtGui.QLineEdit.paste = myPaste # Try #1
app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
window.setWindowTitle("monkey")
centralWidget = QtGui.QWidget(window)
edit = QtGui.QLineEdit(centralWidget)
# QtGui.QLineEdit.paste = myPaste # Try #2
edit.paste = myPaste # Try #3
window.setCentralWidget(centralWidget)
window.show()
app.exec_()
根据反馈..我能够使用事件过滤器建议来解决我的问题。下面是更新的示例代码。。。在
^{pr2}$
为了做你想做的事情,你可以子类
QLineEdit
,并创建一个提供你想要的自定义粘贴功能的方法(paste
方法不是虚拟的,因此如果它被重写,就不会从Qt代码调用它)。此外,您还需要一个事件过滤器来截获CTRL+V的快捷方式。您可能还需要过滤鼠标中键,它也用于粘贴剪贴板内容。从事件筛选器中,您可以调用替换的paste
方法。在您可以使用以下代码作为起点:
这里的事件过滤器只负责粘贴的键盘快捷键。正如我所说,你还需要考虑其他来源的粘贴操作。在
不能“monkey patch”
QLineEdit.paste()
的原因是它不是一个虚拟的函数。关于虚函数的重要一点是,当它们被重写时,重新实现的函数将由Qt在内部调用;而非虚重写只会由Python代码调用。因此,由于QLinedit.paste()
不是虚拟的,您将不得不截获所有通常导致Qt在内部调用的事件。在这意味着要重新实现QLineEdit.keyPressEvent,这样您就可以捕获default key bindings;和{a3}的快捷方式,以便您可以修改默认上下文菜单。而且,根据您要执行的操作,您可能还需要覆盖默认的拖放处理。(如果不想使用子类,可以使用event-filter监视所有相关事件)。在
QClipboard类提供对系统剪贴板的访问,这将允许您在粘贴文本之前拦截文本。每个应用程序都有一个clipboard对象,可以通过
QApplication.clipboard()
或qApp.clipboard()
访问该对象。在相关问题 更多 >
编程相关推荐