首页 文章

如何接受/忽略QKeyEvent

提问于
浏览
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() .

这有点令人困惑 . 我应该致电接受吗?如果我不处理它,我应该调用基本实现还是调用ignore?

第一页读取我不需要调用accept(),第二页读取“传播到父窗口小部件链,直到窗口小部件接受它与accept()”

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

1 回答

  • 2

    就像它说的那样,它会被自动接受 . 所以,如果你必须做任何事情 . 只有当你没有处理关键事件时,你才应该调用 ignore() .

    如果您的类是 QWidget 的子类,并且您正在处理键事件,则不要调用基本实现 . 如果你不处理它,you can just call the base implementation as it will call ignore() .

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

    • 第一页读取我不需要调用accept(),第二页读取"is propagated up the parent widget chain until a widget accepts it with accept()"

    这意味着如果您选择 ignore 它,它将传播到 parent widget . 如果您选择 accept 它,它将 not 传播到 parent widget .

    • 如果我调用它的基础版本'll basically call ignore() if it'的QWidget . 那个't that mean it would return to my keyPressedEvent, return with ignored state, then QWidget'版本再次被调用导致"key event is propagated up to the parent widget"?

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

相关问题