19

假设我有一个MyWidget包含一个MySubWidget,例如一个包含文本字段或其他内容的自定义小部件。我希望其他类能够连接到包含的MySubWidget实例公开的信号和插槽。是执行此操作的常规方法:

  1. 通过方法暴露一个指向MySubWidget实例的指针subWidget()MyWidget
  2. 复制类中的信号和槽MySubWidgetMyWidget编写“转发”代码
  3. 还有什么?

选择 1 似乎是最少的代码,但它也打破了封装,因为现在其他类知道包含的小部件是什么,MyWidget并且可能依赖于它们的功能。

选择 2 看起来像是保持封装,但它有很多看似冗余且可能令人费解的代码,这会破坏整个信号和插槽系统的优雅。

在这种情况下通常会怎么做?

4

3 回答 3

20

如果您查看 Qt 自己的代码,他们更喜欢选项 2。

例如,看看QTabWidgetQTabBar。它们共享许多信号和插槽,但 QTabWidget 隐藏了它使用 QTabBar 的事实(好吧,排序......QTabWidget::tabBar()即使它受到保护,它也显然会破坏这一点)。

虽然这会导致更多的代码,但我认为封装是值得的。

不要忘记您可以将信号连接到信号,如下所示:

connect(mySubWidget, SIGNAL(internalSignal(int)), this, SIGNAL(externalSignal(int)));

MyWidget发射externalSignal(int)时会MySubWidget发射internalSignal(int)。这至少有助于信号方面的事情。不幸的是,我不知道有什么简单的方法可以对插槽做同样的事情。

于 2010-04-01T02:25:36.833 回答
0

我不会担心信号和插槽的封装,大概只有一件事在做连接,那么知道一些子类有什么害处?如果您在一个更大的团队中工作,防止滥用该subWidget()方法是一个问题,但您可以使用friend关键字或其他任何东西来做到这一点......

于 2010-04-01T00:58:15.920 回答
0

您可以公开包含较少功能的 MySubWidget 基类。

于 2010-04-01T01:39:36.383 回答