如何接受/忽略 QKeyEvent
Posted
技术标签:
【中文标题】如何接受/忽略 QKeyEvent【英文标题】:how to accept/ignore QKeyEvent 【发布时间】:2014-02-21 13:39:37 【问题描述】:http://qt-project.org/doc/qt-5/qwidget.html#keyPressEvent
请注意,QKeyEvent 以 isAccepted() == true 开头,因此您不需要 需要调用 QKeyEvent::accept() - 只是不要调用基类 如果您对密钥采取行动,则实施。
http://qt-project.org/doc/qt-5/qkeyevent.html#details
一个键事件包含一个特殊的接受标志,指示是否 接收者将处理关键事件。如果 您的小部件不处理按键或释放事件。一个关键事件 向上传播到父小部件链,直到小部件接受它 使用 accept() 或事件过滤器使用它。关键事件 默认情况下忽略多媒体键。如果你应该调用 accept() 您的小部件会处理这些事件。
这有点令人困惑。我应该打电话接受还是不接受?如果我不处理它,我应该调用基本实现还是调用忽略?
第一页显示我不需要调用accept(),第二页显示“向上传播到父小部件链,直到小部件接受它使用accept()”
如果我调用基本版本,如果它是 QWidget,它基本上会调用 ignore()。那是不是意味着它会返回到我的 keyPressedEvent,返回忽略状态,然后再次调用 QWidget 的版本,因为“键事件被传播到父小部件”?
【问题讨论】:
【参考方案1】:就像它说的那样,它会被自动接受。因此,如果您正在处理它,则无需执行任何操作。只有当您不处理关键事件时,您才应该调用ignore()
。
如果您的类是QWidget
的子类,并且您正在处理按键事件,则不要调用基本实现。如果你不处理,you can just call the base implementation as it will call ignore()
。
如果您想了解有关接受和忽略事件的更多信息,可以阅读this。
第一页显示我不需要调用accept(),第二页显示“向上传播到父小部件链,直到小部件使用accept() 接受它”这意味着如果您选择忽略它,它将被传播到parent widget
。如果您选择接受它,它将传播到parent widget
。
基类与父小部件不同。基类是您的类派生自的类。父窗口小部件是包含this
对象作为其子窗口小部件的对象。这通常是作为参数传递给构造函数的小部件。但是如果父小部件是QWidget
类型,那么是的,就是这样。
【讨论】:
我修改了问题以澄清措辞如何令人困惑。 谢谢!是的,在那种情况下,我的大脑完全混淆了父母和基地。因此,accept() 可能只存在于那些反转默认值的特殊多媒体键。同样,一般来说,调用基类可能是一个好主意,因为它可能会做一些有用的事情(在我的例子中不像 QWidget 本身)。 @Trass3r 在大多数情况下是的。如果您想要默认行为,请调用基类方法。如果您想忽略默认行为,请不要调用基类方法。以上是关于如何接受/忽略 QKeyEvent的主要内容,如果未能解决你的问题,请参考以下文章