仅事件捕获Qt键

2024-04-24 16:59:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想更改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_删除. 我已经把最后一行改成这样:

^{pr2}$

但它不起作用。在


Tags: keytestselfeventuiinitdefqt
1条回答
网友
1楼 · 发布于 2024-04-24 16:59:36

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

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

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

  2. 既然你已经准备好了QTableWidget.keyPressEvent= 自我测试,您还试图从中调用此函数自我测试(),您创建了一个无限递归函数。

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

相关问题 更多 >