2012-07-18 29 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