事件 - 只捕获Qt.Key_Delete

时间:2011-04-21 16:58:59

标签: python pyqt4

我想改变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 个答案:

答案 0 :(得分:4)

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

但我可以很容易地看到这里的一些错误。

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

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

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

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

  5. 示例:

    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中将表窗口小部件“提升”到新类。