2011-04-21 65 views
1

我想改变QTableWidget的Key_Delete的行为,但由于使用设计器,我不想在窗体中对py文件进行任何更改。因此,而不是重新实现QTableWidget的像它这样的回答:How to implement MousePressEvent for a Qt-Designer Widget in PyQt我做这样的事情:事件 - 只捕捉Qt.Key_Delete

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) 

但它不起作用。

回答

4

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

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

1)你重写了方法QTableWidget.keyPressEvent,它需要2个参数:(QTableWidget实例,事件)。但是在上面显示的代码中,您用于覆盖它的函数只需要1个参数(第一个参数'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中将表格小部件“提升”到新类中。

+0

谢谢你的回答!通过“但它不起作用”我的意思是“我不知道如何保持除Qt.Key_Delete之外的其他键的原始行为”。我的例子,没有最后的回报只适用于删除键。所以当我按下QTableWidget中的其他键而不是Delete键时(箭头键不起作用)。我想在** class **级别覆盖此方法。所以问题是:我应该在我的示例代码中更改哪些内容以仅抑制Key_Delete事件并传递其他事件? – domi 2011-05-09 14:58:18

+0

如果你愿意,你可以重载类方法,你只需要1)确保你重写它的函数具有正确的签名,并且2)在其他地方存储对原始函数的引用,以便它仍然可以被调用其他键。我很好奇:你为什么要在课堂上而不是在实例上重写? – Luke 2011-05-12 15:41:00

+0

对不起,我无法发表评论。您能告诉我如何使用我的代码实现第二点吗?为什么要在班级级别上进行重写:两个原因 - 我想尽可能地改变代码, Qt Designer,其次,我想在我的应用程序中的每个QTableWidget中“保留”已更改的行为。我知道子类化是可能的,但这意味着额外的代码和需要重写每个属性(在Qt Designer中设置)从一个类到另一个子类。 – domi 2011-05-28 22:37:48