假设我有MyWidget
,其中包含MySubWidget
,例如包含文本字段或其他内容的自定义窗口小部件。我希望其他类能够连接到包含的MySubWidget
实例公开的信号和插槽。传统的方法是这样做:
MySubWidget
subWidget()
方法公开指向MyWidget
实例的指针
MySubWidget
课程中MyWidget
的信号和广告位并写入“转发”代码选择1似乎是最少的代码,但它也有点破坏封装,因为现在其他类知道MyWidget
包含的小部件是什么,并且可能依赖于它们的功能。
选择2似乎保持了封装,但它有很多看似冗余且可能错综复杂的代码,这会扰乱整个信号和插槽系统的优雅。
在这种情况下通常会做什么?
答案 0 :(得分:19)
如果你看看Qt自己的代码,他们更喜欢选项2。
例如,请查看QTabWidget和QTabBar。它们共享许多信号和插槽,但QTabWidget隐藏了它使用QTabBar的事实(好吧,排序...... QTabWidget::tabBar()
显然会破坏它,即使它受到保护)。
虽然这会产生更多代码,但我认为这对于封装来说是值得的。
不要忘记您可以将信号连接到这样的信号:
connect(mySubWidget, SIGNAL(internalSignal(int)), this, SIGNAL(externalSignal(int)));
当MyWidget
发出externalSignal(int)
时,MySubWidget
会internalSignal(int)
发出{{1}}。这至少对信号方面有帮助。不幸的是,我不知道为插槽做同样的简单方法。
答案 1 :(得分:0)
我不担心信号和插槽的封装,可能只有一件事是连接,所以知道一些子类的危害是什么?如果你正在一个更大的团队工作,防止滥用subWidget()
方法是一个问题,但你可以使用friend关键字或其他任何方式...
答案 2 :(得分:0)
您可以公开包含较少功能的MySubWidget基类。