【发布时间】: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