我在 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
以允许事件冒泡并阻止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