【问题标题】:Qt/OO best practices: connecting signals and slotsQt/OO 最佳实践:连接信号和插槽
【发布时间】:2015-04-14 19:55:19
【问题描述】:

我对 Qt 体验的了解相对较少,但我绝对喜欢它。我不确定的一件事是将信号连接到插槽的最佳位置。这是我的带有触摸屏的小型设备的示例:

我的 QApplication 拥有一个名为 RadioModel 的类。我的 QApplication 还拥有我所说的 ViewController。 ViewController 拥有视图——即构成用户界面的所有小部件。当然,UI 小部件有一些层次结构。顶层小部件是一个 QHBoxLayout,它在顶部有指示器标签,在底部有一个 QTabWidget。 QTabWidget 有 3 个屏幕,每个屏幕都有 QLabels、QGroupBoxes、QComboBoxes 等内容。

当 QGroupBoxes 和 QComboBoxes 中的值发生变化时,需要向模型发出信号。我最初的想法是有一个这样的链:

QRadioButton(QGroupBox 的一部分)发出 clicked() 信号,这将转到 QTabWidget 的当前选项卡的 SLOT,它查看发送者以确定单击的值(哪个单选按钮),然后发出自己的信号,如RadioChanged。这个 RadioChanged 信号会连接到 ViewController 的 RadioChanged 信号,而后者又会连接到 Model 的 UpdateRadio 插槽。

一般来说,当一个与模型完全隔离的小部件发出一个感兴趣的信号时,让这个长长的信号和槽链将该值更改回模型是否公平?将模型传递到 ViewController 和它的一些对象中会更好吗,以便信号可以用更短的路径连接?

谢谢 - 希望这是可以理解的,希望不要太主观..

【问题讨论】:

  • 信号映射器帮助将clicked 转换为changed。确实,有时将信号传递出去是一种痛苦,但是从 OO 的角度来看,在 ViewController 之外,没有人知道或关心在 ViewController 中路由信号是多么痛苦,因此没有理由打破 OO 规则让 ViewController 的生活更轻松。实际上,如果顶级信号/插槽以丑陋的实现级信号/插槽为代价保持干净,我实际上认为这是一个很好的牺牲。
  • 感谢信号映射器的提醒。我发誓不会违反 OO 规则。

标签: c++ qt signals-slots


【解决方案1】:

我将我的实现为“控制器控制数据流”。它从视图中获取信号。然后它会根据需要更新模型。视图对模型一无所知,反之亦然。

我注意到您说您是在向每个用户输入更改发出信号。这可能非常低效,并且难以取消一半所做的更改。我通常让用户更改所有字段,并且仅在按下 OK 按钮时更新模型。

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 2023-03-28
    • 2012-10-15
    • 1970-01-01
    • 2015-03-14
    • 2010-10-22
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    相关资源
    最近更新 更多