我想改变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)
但它不起作用。
答案 0 :(得分:4)
首先:“但它不起作用”通常不够描述。你期待什么行为?你看到的行为是什么?有没有错误消息?
但我可以很容易地看到这里的一些错误。
您正在覆盖QTableWidget.keyPressEvent方法,该方法需要2个参数:(QTableWidget实例,事件)。但是在上面显示的代码中,用于覆盖它的函数只需要1个参数(第一个参数'self',因为它是自动提供的,所以不计算)。
由于您已设置QTableWidget.keyPressEvent = self.test,并且您还尝试在 self.test()中从调用此函数,因此您创建了一个无限递归函数。
当你调用QTableWidget.keyPressEvent时,你传入的第一个参数(self)是一个QMainWindow对象。但是正如我上面提到的,这个函数需要一个QTableWidget作为它的第一个参数。
由于您在 class 级别覆盖此方法,所有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中将表窗口小部件“提升”到新类。