暴露包含小部件的信号/插槽的正确Qt习语是什么?

时间:2010-04-01 00:17:26

标签: c++ qt signals-slots

假设我有MyWidget,其中包含MySubWidget,例如包含文本字段或其他内容的自定义窗口小部件。我希望其他类能够连接到包含的MySubWidget实例公开的信号和插槽。传统的方法是这样做:

  1. 通过MySubWidget
  2. 中的subWidget()方法公开指向MyWidget实例的指针
  3. 复制MySubWidget课程中MyWidget的信号和广告位并写入“转发”代码
  4. 别的什么?
  5. 选择1似乎是最少的代码,但它也有点破坏封装,因为现在其他类知道MyWidget包含的小部件是什么,并且可能依赖于它们的功能。

    选择2似乎保持了封装,但它有很多看似冗余且可能错综复杂的代码,这会扰乱整个信号和插槽系统的优雅。

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

3 个答案:

答案 0 :(得分:19)

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

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

虽然这会产生更多代码,但我认为这对于封装来说是值得的。

不要忘记您可以将信号连接到这样的信号:

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

MyWidget发出externalSignal(int)时,MySubWidgetinternalSignal(int)发出{{1}}。这至少对信号方面有帮助。不幸的是,我不知道为插槽做同样的简单方法。

答案 1 :(得分:0)

我不担心信号和插槽的封装,可能只有一件事是连接,所以知道一些子类的危害是什么?如果你正在一个更大的团队工作,防止滥用subWidget()方法是一个问题,但你可以使用friend关键字或其他任何方式...

答案 2 :(得分:0)

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