0

在 QWidget 中,鼠标和绘画等事件不是信号,而是需要重载的虚函数。为什么会出现这种情况,而不是保持一致?

4

1 回答 1

2

尽管我在 Qt 的文档中找不到任何说明他们使用虚拟函数进行事件的动​​机的内容,但我可以猜测:

  1. 信号和插槽可以很好地使用,但它们有相关的开销(请参阅此问题的答案)。由于事件被非常频繁地触发,因此使用信号和槽可能会带来相当大的性能损失。
  2. 一些事件处理程序需要返回值。官方不支持将值从插槽返回到信号发射器(尽管请参阅此问题),这意味着它们不合适。
  3. QWidget从设计的角度来看,发出的信号可能没有意义。如果我创建自己的从 派生的小部件QWidget,为什么我的小部件发出的信号只是连接回小部件本身的插槽?这也有破坏封装的危险,因为信号总是“公开的”。

即使以上都不是真的,尝试使用事件信号仍然会引发很多架构问题。例如,单个事件通常被传递给多个不同的对象(例如,在某些对象不希望处理该事件的情况下)。在这种情况下,哪个对象发出指示事件已发生的信号?它当然不是事件的目标(即小部件,正如您在上面暗示的那样)。它必须是其他一些全局对象。但如果这是真的,我们可能会在每个小部件上实现虚拟插槽来处理信号。这实际上只是让我们回到了我们从虚拟函数开始的地方!

于 2013-06-05T04:31:06.100 回答