代码之家  ›  专栏  ›  技术社区  ›  Tyler McHenry

正确的qt习惯用法是什么,用于公开包含的小部件的信号/插槽?

  •  18
  • Tyler McHenry  · 技术社区  · 15 年前

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

    1. 将指针暴露到 MySub小部件 实例通过 subWidget() 方法在 MyWIDGET
    2. 复制信号和插槽 MySub小部件 MyWIDGET 分类并编写“转发”代码
    3. 还有别的吗?

    选项1看起来是最少的代码,但它也有点破坏了封装,因为现在其他类知道了包含的小部件是什么 MyWIDGET 现在和可能会依赖于它们的功能。

    选项2看起来像是保持了封装,但是它有很多看似冗余的、可能是复杂的代码,这些代码破坏了整个信号和插槽系统的优雅。

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

    3 回复  |  直到 15 年前
        1
  •  18
  •   richardwb    15 年前

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

    例如,看看 QTabWidget QTabBar . 它们共享许多信号和插槽,但qtabwidget隐藏了一个事实,即它使用了qtababar(好吧,sorta… QTabWidget::tabBar() 显然,即使它受到保护,也会破坏它。

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

    别忘了你可以把信号和这样的信号连接起来:

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

    这将使 MyWidget 发出 externalSignal(int) 什么时候 MySubWidget 发射 internalSignal(int) . 这至少对信号方面有帮助。不幸的是,我不知道有什么简单的方法可以为吃角子老虎机做同样的事情。

        2
  •  0
  •   Dan O    15 年前

    我不担心信号和插槽的封装,大概只有一件事在进行连接,那么了解一些子类有什么坏处呢?如果你在一个更大的团队工作,防止滥用 subWidget() 方法是一个关注点,但您可以使用friend关键字或其他任何方法…

        3
  •  0
  •   sisis    15 年前

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