1

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

按键事件包含一个特殊的接受标志,指示接收器是否将处理按键事件。如果您的小部件未处理按键按下或释放事件,您应该调用 ignore()。一个关键事件沿父窗口小部件链向上传播,直到窗口小部件使用 accept() 接受它或事件过滤器使用它。默认情况下忽略多媒体按键的按键事件。如果您的小部件处理这些事件,您应该调用 accept()。

这有点令人困惑。我应该打电话接受还是不接受?如果我不处理它,我应该调用基本实现还是调用忽略?

第一个页面显示我不需要调用accept(),第二个页面显示“向上传播到父小部件链,直到小部件使用accept()接受它”

如果我调用基本版本,如果它是 QWidget,它基本上会调用 ignore()。这是否意味着它将返回到我的 keyPressedEvent,返回忽略状态,然后再次调用 QWidget 的版本,因为“键事件被传播到父小部件”?

4

1 回答 1

3

就像它说的那样,它会被自动接受。因此,如果您正在处理它,则无需执行任何操作。只有当你不处理你应该调用的关键事件时ignore()

如果您的类是 的子类QWidget,并且您正在处理键事件,则不要调用基本实现。如果你不处理它,你可以调用基本实现,因为它会调用ignore().

如果您想了解有关接受和忽略事件的更多信息,可以阅读此内容。

  • 第一个页面显示我不需要调用accept(),第二个页面显示“向上传播到父小部件链,直到小部件使用accept() 接受它”

这意味着如果您选择忽略它,它将被传播到parent widget. 如果您选择接受它,它将不会传播到parent widget.

  • 如果我调用基本版本,如果它是 QWidget,它基本上会调用 ignore()。这是否意味着它将返回到我的 keyPressedEvent,返回忽略状态,然后再次调用 QWidget 的版本,因为“键事件被传播到父小部件”?

基类与父小部件不同。基类是您的类派生自的类。父窗口小部件是包含this对象作为其子窗口小部件的对象。这通常是作为参数传递给构造函数的小部件。但是如果父小部件是一种QWidget类型,那么是的,就是这样。

于 2014-02-21T13:52:53.693 回答