gpt4 book ai didi

user-interface - 在 GUI 中打破事件循环

转载 作者:行者123 更新时间:2023-12-03 14:19:31 25 4
gpt4 key购买 nike

在编写 GUI 时,我经常遇到以下问题:假设您有一个模型和一个 Controller 。 Controller 有一个小部件 W用于显示属性 X的模型。

因为模型可能会从 Controller 外部更改(可能有其他 Controller 使用相同的模型,撤消操作等), Controller 会监听模型上的更改。 Controller 还监听小部件 W 上的事件。并更新属性 X因此。

现在,会发生以下情况:

  • W 中的值已更改
  • 生成一个事件, 中的处理程序 Controller 被调用
  • Controller X 设置新值在 型号
  • 型号发出事件,因为它已被更改
  • Controller 接收更改事件型号
  • Controller 获取 X 的值并将其设置在小部件
  • 转到 1.

  • 有几种可能的解决方案:
  • 修改 Controller 以在模型更新时设置一个标志,如果设置了此标志,则不对来自模型的任何事件使用react。
  • 暂时断开 Controller (或告诉模型一段时间不要发送任何事件)
  • 卡住来自小部件的所有更新

  • 过去,我通常选择选项 1,因为这是最简单的事情。它的缺点是用标志使你的类困惑,但其他方法也有它们的缺点。

    只是为了记录,我在几个 GUI 工具包中遇到了这个问题,包括 GTK+、Qt 和 SWT,所以我认为它与工具包无关。

    有什么最佳实践吗?还是我使用的架构完全错误?

    @Shy:在某些情况下,这是一种解决方案,但如果 X,你仍然会得到一轮多余的事件。从 Controller 外部更改(例如,使用撤消/重做的命令模式时),因为值已更改, W被更新并触发一个事件。为了防止对模型进行另一次(无用的)更新,必须吞下小部件生成的事件。
    在其他情况下,模型可能更复杂,简单检查究竟发生了什么变化可能不可行,例如一个复杂的 TreeView 。

    最佳答案

    处理此问题的标准 QT 方法以及他们非常有用的教程中建议的方法是,仅当新值与当前值不同时才更改 Controller 中的值。
    这是信号具有 valueChanged() 语义的方式

    see this tutorial

    关于user-interface - 在 GUI 中打破事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/124722/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com