gpt4 book ai didi

python - 事件 - 仅捕获 Qt.Key_Delete

转载 作者:太空宇宙 更新时间:2023-11-04 11:00:43 25 4
gpt4 key购买 nike

我想为 QTableWidget 更改 Key_Delete 的行为,但由于使用了 Designer,我不想在带有表单的 py 文件中进行任何更改。因此,不是像这样重新实现 QTableWidget 而是这个答案:How to implement MousePressEvent for a Qt-Designer Widget in PyQt我做这样的事情:

class MyForm(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)

self.ui.tableWidget.__class__.keyPressEvent = self.test

def test(self,event):
if event.key() == Qt.Key_Delete:
print "test"

return QTableWidget.keyPressEvent(self, event)

问题是我不知道如何保持除 Qt.Key_Delete 之外的其他键的原始行为。我已经像这样更改了最后一行:

return QtGui.QTableWidget.keyPressEvent(self, event)
return QtGui.QTableWidget.event(self, event)

但它不起作用。

最佳答案

首先:“但它不起作用”通常描述性不够。你期望什么行为?你看到的行为是什么?是否有任何错误消息?

不过,我很容易看出这里的一些错误。

  1. 您正在覆盖 QTableWidget.keyPressEvent 方法,它需要 2 个参数:(QTableWidget 实例,事件)。但是在上面显示的代码中,您用来重写它的函数只需要一个参数(第一个参数“self”不计算在内,因为它是自动提供的)。

  2. 由于您已设置 QTableWidget.keyPressEvent = self.test,并且您还试图从 self.test() 调用此函数,因此您创建了一个无限递归函数。

  3. 当您调用 QTableWidget.keyPressEvent 时,您传入的第一个参数 (self) 是一个 QMainWindow 对象。然而,正如我上面提到的,这个函数需要一个 QTableWidget 作为它的第一个参数。

  4. 由于您在 级别覆盖此方法,因此所有 QTableWidgets 将被迫使用相同的 keyPressEvent 函数(这将是非常有问题的)。相反,您应该只覆盖您特定的小部件的方法:self.ui.tableWidget.keyPressEvent = self.test(还要注意 tableWidget.keyPressEvent 的签名不同于 QTableWidget.keyPressEvent)

例子:

from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
win = QtGui.QMainWindow()
win.show()

table = QtGui.QTableWidget()
win.setCentralWidget(table)
def test(event):
if event.key() == QtCore.Qt.Key_Delete:
print "delete"
return QtGui.QTableWidget.keyPressEvent(table, event)
table.keyPressEvent = test

最后,另一种(可能更简洁)的方法是创建 QTableWdget 的子类,并在 Designer 中将表格小部件“提升”到您的新类中。

关于python - 事件 - 仅捕获 Qt.Key_Delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5747304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com