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

Tyl*_*nry 19 c++ qt signals-slots

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

  1. MySubWidget通过subWidget()in中的方法公开指向实例的指针MyWidget
  2. 复制信号和时隙MySubWidget中的MyWidget类,并用"转发"的代码
  3. 别的什么?

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

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

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

ric*_*dwb 19

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

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

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

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

connect(mySubWidget, SIGNAL(internalSignal(int)), this, SIGNAL(externalSignal(int)));
Run Code Online (Sandbox Code Playgroud)

哪个会在MyWidget发出externalSignal(int)MySubWidget发光internalSignal(int).这至少对信号方面有帮助.不幸的是,我不知道为插槽做同样的简单方法.