我正在处理一些Qt代码,我需要将一个按键事件传播到子窗口小部件(在QScrollArea中)。我无法直接调用keyPressEvent()
因为它受到保护,所以我想我会调用event()
并让它处理事件(请注意,这是包含滚动区域keyPressEvent()
中的现有事件覆盖)。 event()
方法在基类QObject
上是公共和虚拟的,但它在QWidget
上受到保护。所以,我最终做了这样的事情:
((QObject*)(childWidget())->event(e);
这很有效,而AFAICT在Qt中完全可以。我可能也可以调用QCoreApplication::postEvent()
或类似的,但我认为这会花费更多的开销(甚至可能导致无限循环,如果事件从子节点返回到父节点,它会重新发布它,等)。
我的问题是,为什么Qt会在派生类event()
上对QWidget
进行保护,而它在基类QObject
上是公开的?这实际上是一个设计问题,而不是实现。
作为一个相关问题,我知道Qt努力维护版本之间的二进制兼容性 - 是否会使该方法公开更改二进制兼容性?该方法已经被声明为虚拟,所以我认为它不会改变任何二进制签名。这真的是我自己的启发 - 我没有任何拉动Qt或任何东西。
答案 0 :(得分:1)
通常事件会从子窗口小部件传播到父窗口小部件,因为子窗口小部件通常(如果不是总是)位于其父窗口之前。此传播在窗口小部件代码中内部完成,因此无需手动执行。
我怀疑该方法可能在窗口小部件级别受到保护的一个原因是让您三思而后行,尝试以相反的顺序传播事件,即父对象。为什么你需要反过来呢?