我在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
答案 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);
}