【发布时间】:2012-07-30 10:12:54
【问题描述】:
我在 Maya(一个 3D 计算机图形应用程序)的一个小部件中有 QTreeWidget。问题是,我的小部件不仅阻止了本机 CTRL+A 热键,它还在选择我的树中的所有内容。如何让这个热键冒泡到父应用程序?
我已经在使用事件过滤器来处理很多自定义键,但树似乎想为我处理这个。我喜欢箭头键功能,所以我不想禁用所有键绑定,但如果必须,我会......如果我知道怎么做
干杯,
附:这里提出了类似的问题,但答案忽略了这个问题: qt: I would like to disable the key bindings automatically set for a QTreeView
这里是 A 在 Python 中用于 QTreeWidget 的解决方案。
我无法确定这是我用 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 以允许事件冒泡并阻止KeyPressEvent 用于CTRL+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
【问题讨论】:
标签: qt key-bindings maya qtreeview qtreewidget