在编写GUI时,我经常遇到以下问题:假设你有一个模型和一个控制器。控制器有一个小部件W
,用于显示模型的属性X
。
由于模型可能会从控制器外部更改(可能有其他控制器使用相同的模型,撤消操作等),因此控制器会侦听模型上的更改。控制器还会侦听窗口小部件W
上的事件,并相应地更新属性X
。
现在,发生以下情况:
W
中的值已更改X
的新值 X
的值并将其设置在小部件中有几种可能的解决方案:
在过去,我通常会选择选项1.因为这是最简单的事情。它的缺点是用标志混乱你的类,但其他方法也有它们的缺点。
仅仅是为了记录,我已经遇到了几个GUI工具包的问题,包括GTK +,Qt和SWT,所以我认为这是非常适合工具包的。
任何最佳做法?或者我使用的架构是错误的?
@Shy:对于某些情况,这是一个解决方案,但是如果从控制器外部更改X
(例如,当使用命令模式进行撤消/重做时),您仍会得到一轮多余的事件,因为然后值已更改,W
已更新并触发事件。为了防止对模型进行另一次(无用的)更新,必须吞下小部件生成的事件
在其他情况下,模型可能更复杂,并且对确切改变的内容进行简单检查可能是不可行的,例如,一个复杂的树视图。
答案 0 :(得分:5)
处理此问题的标准QT方法以及其非常有用的教程中建议的方法是仅在新值与当前值不同时才更改控制器中的值。
这是信号具有valueChanged()
答案 1 :(得分:3)
通常,您应该响应窗口小部件中的输入事件,而不是更改事件。这可以防止发生这种类型的循环。
答案 2 :(得分:1)
表示更新工作的标志。您可以将它们包装在BeginUpdate和EndUpdate等方法中。