http://qt-project.org/doc/qt-5/qwidget.html#keyPressEvent
请注意,QKeyEvent以isAccept()==true开头,因此您不需要需要调用QKeyEvent::accept()-只是不调用基类如果您按键操作,则执行。
http://qt-project.org/doc/qt-5/qkeyevent.html#details
键事件包含一个特殊的接受标志,该标志指示接收器将处理密钥事件。如果按键按下或释放事件不由您的小部件处理。关键事件向上传播到父小部件链,直到小部件接受它为止使用accept()或事件筛选器使用它默认情况下会忽略多媒体键。如果您的小部件处理这些事件。
这有点令人困惑。我应该打电话给接受还是不接受?如果我不处理它,我应该调用基本实现还是调用ignore?
第一页写着"我不需要调用accept(),第二页写着"沿着父窗口小部件链向上传播,直到小部件用accept()接受它">
如果我调用基本版本,如果它是QWidget,它基本上会调用ignore()。这难道不意味着它会返回到我的keyPressedEvent,返回忽略状态,然后QWidget的版本被再次调用,因为"键事件被传播到父窗口小部件"吗?
正如它所说,它是自动接受的。所以,如果你在处理它,你什么都不用做。只有当您没有处理关键事件时,才应该调用ignore()
。
如果您的类是QWidget
的子类,并且您正在处理键事件,那么不要调用基实现。如果您不处理它,您可以直接调用基本实现,因为它将调用ignore()
。
如果你想了解更多关于接受和忽略事件的信息,你可以阅读这篇文章。
- 第一页读到我不需要调用accept(),第二页读到"向上传播到父小部件链,直到小部件用accept(()接受它">
这意味着如果您选择忽略它,它将传播到parent widget
。如果您选择接受,它将不传播到parent widget
。
- 如果我调用基本版本,如果它是QWidget,它基本上会调用ignore()。这难道不意味着它会返回到我的keyPressedEvent,返回忽略状态,然后QWidget的版本被再次调用,因为"键事件被传播到父窗口小部件"吗
基类与父窗口小部件不同。基类是您的类派生自的类。父窗口小部件是包含this
对象作为其子窗口小部件的对象。这通常是作为参数传递给构造函数的小部件。但是,如果父窗口小部件是QWidget
类型,那么是的,情况就是这样。