如何禁用选择所有QTreeView密钥绑定
问题描述:
我在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
答
重新实现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);
}
奇怪。当按下按键或按下修饰键时,我会看到单独的事件,但当收到“a”时,修饰符总是为false。我会给我的问题添加一个例子 – Rafe 2012-07-30 01:35:41
完美! QWidget.keyPressEvent不是必需的。无视这个伎俩!没有这个事件请参阅上面我的问题的结果。 – Rafe 2012-07-30 01:57:45