2013-04-04 115 views
2

我試圖捕獲key_tab事件,但沒有運氣。我意識到只有在沒有其他小部件的情況下才能使用,所以遊標沒有去哪裏纔可以讓事件返回。這裏是一個簡化的代碼示例。如何捕獲Key_tab事件

class MyCombo(QComboBox): 

    def __init__(self, parent=None): 
     super(MyCombo, self).__init__(parent) 
     self.setEditable(True) 

    def keyPressEvent(self, event): 
     if (event.type() == QEvent.KeyPress) and (event.key() == Qt.Key_Tab): 
      print "tab pressed" 
     elif event.key() == Qt.Key_Return: 
      print "return pressed" 
     else: 
      QComboBox.keyPressEvent(self, event) 

class Form_1(QDialog): 

    def __init__(self, parent=None): 
     super(Form_1, self).__init__(parent) 
     self.combo = MyCombo() 
     self.line = QLineEdit() 
     layout = QVBoxLayout() 
     layout.addWidget(self.combo) 
     layout.addWidget(self.line) 
     self.setLayout(layout) 

app = QApplication(sys.argv) 
form = Form_1() 
form.show() 
app.exec_() 

如果我註釋掉以下兩行

self.line = QLineEdit() 
layout.addWidget(self.line) 

然後正常工作,因爲只剩下一個窗體上的小部件。

我在哪裏出錯?

乾杯,喬

+0

這個問題是特定於Key_tab,還是會影響其他鍵? – amccormack 2013-04-04 05:16:00

+0

我沒有嘗試庫中的每個鍵,但正如我在上面的示例代碼中,我嘗試了可以​​正常工作的key_return。 – JoeMicro 2013-04-04 15:40:11

+0

我想弄清楚這個問題是否特定於key_tab或者其他鍵是否受到影響。 – amccormack 2013-04-04 16:41:35

回答

0

顯然,KEY_TAB按壓事件是永遠不會爲了攔截KEY_TAB事件傳遞給任何處理,但到的setFocus(),因此,我們需要實現的事件()方法本身。 所以這裏是新代碼:

class MyCombo(QComboBox): 

    def __init__(self, parent=None): 
     super(MyCombo, self).__init__(parent) 
     self.setEditable(True) 

    def keyPressEvent(self, event): 
     if event.key() == Qt.Key_Return: 
      print "return pressed" 
     else: 
      QComboBox.keyPressEvent(self, event) 

    def event(self, event): 
     if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Tab: 
      print "tab pressed" 
      return False 
     return QWidget.event(self, event) 

class Form_1(QDialog): 

    def __init__(self, parent=None): 
     super(Form_1, self).__init__(parent) 
     self.combo = MyCombo() 
     self.line = QLineEdit() 
     layout = QVBoxLayout() 
     layout.addWidget(self.combo) 
     layout.addWidget(self.line) 
     self.setLayout(layout)