我想更改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)


但这不起作用。

最佳答案

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

不过,我在这里很容易看到一些错误。


您将重写QTableWidget.keyPressEvent方法,该方法需要2个参数:(QTableWidget实例,事件)。但是,在上面显示的代码中,用于覆盖它的函数仅带有1个参数(第一个参数“ self”不计数,因为它是自动提供的)。
由于已设置QTableWidget.keyPressEvent = self.test,并且还尝试从self.test()中调用此函数,因此创建了一个无限递归函数。
调用QTableWidget.keyPressEvent时,您传入的第一个参数(自身)是QMainWindow对象。但是,如上所述,该函数期望将QTableWidget作为其第一个参数。
由于您是在类级别覆盖此方法的,因此所有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/

10-12 21:13