【问题标题】:What is the correct Qt idiom for exposing signals/slots of contained widgets?暴露所包含小部件的信号/插槽的正确 Qt 习惯用法是什么?
【发布时间】:2011-02-03 04:23:40
【问题描述】:

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

  1. 通过MyWidget 中的subWidget() 方法公开指向MySubWidget 实例的指针
  2. MyWidget类中复制MySubWidget的信号和槽,并编写“转发”代码
  3. 还有别的吗?

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

选择 2 似乎保持封装,但它有很多看似冗余且可能令人费解的代码,有点搞砸了整个信号和插槽系统的优雅。

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

【问题讨论】:

    标签: c++ qt signals-slots


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

        【讨论】:

        • 如果我可以为SIGNAL,SIGNAL 连接,我会为你投票两次。很有用!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-29
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        相关资源
        最近更新 更多