2011-04-21 64 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