1

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

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

干杯,

PS这里问了类似的问题,但答案忽略了这个问题: qt:我想禁用为QTreeView自动设置的键绑定


这是QTreeWidget 的 Python 解决方案

我无法确定这是我用 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以允许事件冒泡并阻止KeyPressEventCTRL+A。

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
4

1 回答 1

3

重新实现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);
}
于 2012-07-18T01:45:45.460 回答