2012-07-18 48 views
0

我在QtreeWidget中的一個小部件在Maya中(3D計算機圖形應用程序)。問題是,我的小部件不僅阻止了原生的CTRL + A熱鍵,它正在選擇我的樹中的所有東西。我怎樣才能讓這個熱鍵泡到父應用程序?如何禁用選擇所有QTreeView密鑰綁定

我已經使用事件過濾器進行了大量的自定義鍵處理,但似乎樹想爲我處理這一個。我喜歡的方向鍵的功能,所以我不希望禁用所有鍵綁定,但如果我必須這樣做,我會......如果我知道如何

乾杯,

附:類似的事情在這裏問,但答案忽略了一個問題: qt: I would like to disable the key bindings automatically set for a QTreeView


這裏是Python中的解決方案的QTreeWidget。

我無法確定這是我用Python做過的最骯髒的事情還是隻是一個漂亮的Python版本的擴展方法! (感覺像前者)

問題是,我實際上沒有QTreeView類。它是在一個名爲「樹」的設計師加入,所以我硬是推翻,則該方法從方法調用的基本功能...

def __init__ #...snip... 
    self.tree.keyPressEvent = self.onKeyPressEvent # Replace with my method 


def onKeyPressEvent(self, event): 
    if event.key() == Qt.Key_A and event.modifiers() == Qt.ControlModifier: 
     event.ignore() # Allows fall-through to the parent 
     return 

    QtGui.QTreeView.keyPressEvent(self.tree, event) # All other behaviors handled 

...所以,這只是太髒了我。我知道必須有這種常見情況的解決方案(沒有子類)。我已經在使用事件過濾器,所以我嘗試了它並且工作。關鍵是知道事件在哪裏處理,並使用event.ignore()以及返回True來允許事件冒泡並阻止CTRL + A的KeyPressEvent

def eventFilter(self, obj, event): 
    # Filter out all non-KeyPress events 
    if not event.type() == QEvent.KeyPress: 
     return False 

    if event.key() == Qt.Key_A and event.modifiers() == Qt.ControlModifier: 
     event.ignore() # Allows fall-through to the parent 
     return True  # Block the tree's KeyPressEvent 

    return False  # Do nothing 

回答

2

重新實現keyPressEvent,並且按下CTRL + A時忽略該事件。

的代碼都類似於此:

MyTreeView::keyPressEvent(QKeyEvent *e) 
{ 
    if(e->key() == Qt::Key_A && e->modifiers() == Qt::ControlModifier) 
    { 
     e->ignore(); 
     QWidget::keyPressEvent(e); // Not sure about this. Please try and report! 
    } 
    else 
     QTreeView::keyPressEvent(e); 
} 
+0

奇怪。當按下按鍵或按下修飾鍵時,我會看到單獨的事件,但當收到「a」時,修飾符總是爲false。我會給我的問題添加一個例子 – Rafe 2012-07-30 01:35:41

+0

完美! QWidget.keyPressEvent不是必需的。無視這個伎倆!沒有這個事件請參閱上面我的問題的結果。 – Rafe 2012-07-30 01:57:45