如何禁用选择所有QTreeView键绑定

时间:2012-07-18 00:23:49

标签: qt key-bindings maya qtreeview qtreewidget

我在Maya的一个小部件中有一个QTreeWidget(一个3D计算机图形应用程序)。问题是,我的小部件不仅阻止了本机CTRL + A热键,它还在我的树中选择所有内容。如何让这个热键泡泡到父应用程序?

我已经在使用事件过滤器进行了大量的自定义键处理,但似乎树想要为我处理这个。我喜欢箭头键功能,所以我不想禁用所有键绑定,但如果必须,我会...如果我知道如何

干杯,

P.S。这里有类似问题,但答案忽略了这个问题: qt: I would like to disable the key bindings automatically set for a QTreeView


这是用于QTreeWidget的Python中的 A 解决方案。

我无法确定这是否是我用Python做过的最脏的事情,或者只是一个漂亮的Python版本的扩展方法! (感觉就像前者。)

问题是,我实际上没有QTreeView类。它在名为“tree”的设计器中添加,所以我实际上覆盖了该方法,然后从 my 方法调用基本功能...

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

1 个答案:

答案 0 :(得分: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);
}