为什么Qt有时会使用虚函数来代替信号?

时间:2013-06-05 02:07:39

标签: qt signals-slots

在QWidget中,鼠标和绘画以及其他事件不是信号,而是要重载的虚函数。为什么会这样,而不是一致?

1 个答案:

答案 0 :(得分:2)

虽然我在Qt的文档中找不到任何说明他们使用虚拟函数进行事件的动​​机,但我猜:

  1. 信号和插槽可以很好地使用,但是它们有相关的开销(参见this question的答案)。由于事件频繁触发,信号和插槽的使用可能会带来相当大的性能损失。
  2. 某些事件处理程序需要返回值。将一个值从一个槽返回到信号发射器不是正式支持(尽管见this question),这意味着它们不合适。
  3. 从设计的角度来看,QWidget发出的信号可能没有意义。如果我创建自己的小部件派生自QWidget,为什么我的小部件发出的信号只是连接回小部件本身的插槽?这也有破坏封装的危险,因为信号总是“公开”。
  4. 即使上述情况都不正确,尝试将信号用于事件仍然会产生很多架构问题。例如,单个事件通常被传递给多个不同的对象(例如,在某些对象不希望处理事件的情况下)。在这种情况下,哪个对象发出指示事件发生的信号?它肯定不是事件的目标(即小部件,正如您在上面暗示的那样)。它必须是其他一些全球性的对象。但如果这是真的,我们可能只是在每个小部件上实现虚拟插槽来处理信号。这基本上只是让我们回到了虚拟功能开始的地方!