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

20
假设我有一个包含一个MySubWidget的MyWidget,例如包含文本字段或其它东西的自定义小部件。 我想让其他类能够连接到所包含的MySubWidget实例公开的信号和插槽。 常规方法是这样做吗?
  1. 通过MyWidget中的subWidget()方法公开对MySubWidget实例的指针
  2. 在MyWidget类中复制MySubWidget的信号和插槽,并编写"转发"代码
  3. 还有其它选择吗?
选择1似乎是最少的代码,但它也有点破坏了封装性,因为现在其他类知道了MyWidget中包含的小部件,并可能变得依赖它们的功能。
选择2似乎保持了封装性,但这是大量看似冗余且潜在混乱的代码,会破坏整个信号和插槽系统的优雅。
在这种情况下通常怎么做?
3个回答

21

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

例如,看看QTabWidgetQTabBar。它们共享许多信号和槽,但是QTabWidget隐藏了它使用QTabBar的事实(嗯,有点...QTabWidget::tabBar()当然破坏了这个封装,尽管它是受保护的)。

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

不要忘记你可以像这样连接信号到信号:

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

MySubWidget发出 internalSignal(int) 信号时,这将使得MyWidget发出 externalSignal(int) 信号。至少在信号方面会有所帮助。不幸的是,我不知道如何轻松地做到同样的事情来处理槽函数。


如果可以的话,我会给你点赞两次,因为那个 SIGNAL,SIGNAL 连接非常有用! - lethal-guitar

0

关于信号和槽的封装,我觉得没必要过于担心。毕竟只有一个东西在进行连接,如果它知道一些子类,那又有什么坏处呢?如果你在一个更大的团队中工作,防止滥用 subWidget()方法是一个值得关注的问题,但你可以使用friend关键字或其他方法来实现...


0

你可以暴露一个包含较少功能的MySubWidget基类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接